j3iiifn’s blog

ネットワーク、インフラ、プログラミングについての備忘録

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 コマンドを叩いているだけ。

ルールファイルの保存場所

  • IPv4/etc/iptables/rules.v4
  • IPv6/etc/iptables/rules.v6

手動実行

ルールを保存するとき

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