iptables-persistent / netfilter-persistent を理解する
Ubuntu 18.04.2でNetfilterルールを自動でリストアするために、iptables-persistent / netfilter-persistentを使うことにした。 その内部処理を調べたのでまとめてみる。
動作確認環境
Ubuntu 18.04.2
$ dpkg -l | grep persistent ii iptables-persistent 1.0.4+nmu2 all boot-time loader for netfilter rules, iptables plugin ii netfilter-persistent 1.0.4+nmu2 all boot-time loader for netfilter configuration
インストール方法
sudo apt install iptables-persistent
依存関係で netfilter-persistent パッケージも同時にインストールされる。
iptables-persistent と netfilter-persistent の関係
iptables-persistent は netfilter-persistent のモジュールである。
netfilter-persistent
コマンドを実行すると、 /usr/share/netfilter-persistent/plugins.d
ディレクトリにあるスクリプトが run-parts
によって呼び出される(/usr/sbin/netfilter-persistent
はただのシェルスクリプトなので、この動作はcatコマンドで読めばわかる)。
iptables-persistent パッケージをインストールすると、次のファイルが配置される。
/usr/share/netfilter-persistent/plugins.d/15-ip4tables
/usr/share/netfilter-persistent/plugins.d/25-ip6tables
上がIPv4用、下がIPv6用のシェルスクリプトで、現在のNetfilterルールをルールファイルに保存したり、ルールファイルからリストアしたりする役割を持つ。
iptables-persistentの内部処理
iptables-save
コマンドと iptables-restore
コマンドを叩いているだけ。
ルールファイルの保存場所
手動実行
ルールを保存するとき
sudo netfilter-persistent save or sudo service netfilter-persistent save
iptables-persistentは自動でルールを保存してくれないので、iptablesコマンドでルールを変更した後は、忘れずにこのコマンドを実行しなければならない。
ルールをリストアするとき
sudo netfilter-persistent start or sudo service netfilter-persistent start
startではなくrestart、reload、force-reloadでも同じ処理が実行される。
自動実行
ルールの自動リストアはsystemdで実現されている。
- OS起動時に
netfilter-persistent start
が実行され、ルールがリストアされる。 - OSシャットダウン時に
netfilter-persistent stop
が実行される。ただし、実際には何も実行されない(/usr/share/netfilter-persistent/plugins.d/15-ip4tables
を読むと、stopが指定されたときの処理が何も書かれていないことがわかる)。
この記事を執筆するにあたって読んだファイル
/usr/share/doc/netfilter-persistent/README /usr/share/doc/iptables-persistent/README /lib/systemd/system/netfilter-persistent.service /usr/sbin/netfilter-persistent /usr/share/netfilter-persistent/plugins.d/15-ip4tables /usr/share/netfilter-persistent/plugins.d/25-ip6tables