仮想マシン再起動時にsystemdで以ってiptablesのルールを保存・適用

OS: Ubuntu Server 18.04.1 LTS
VMware Workstation Pro 14.1.1 build-7528167

以前はifupdownでiptablesのルールを保存・適用していたけれども、近頃はnetplanの台頭によって流儀が異なるようである。netplanは2018年10月2日現在でif-up.dやif-down.dのような仕組みを持ち合わせていないという。代わりにnetworkd-dispatcherを使う手がある模様である。

ネットワークインターフェースが無効になった際に動き出すのは /usr/lib/networkd-dispatcher/off.d/ 配下に設置したスクリプトで、有効となった場合は /usr/lib/networkd-dispatcher/routable.d/ 配下のスクリプトであるという。

図1. Netplan frequently asked questionsによる対応表

ところがVMware上のUbuntu仮想マシンではoff.d配下のスクリプトが全然起動しなかった。スクリプトの所有権をrootにし、パーミッションも700にセットして必要条件を満たしてもどうしてもダメである。手動でネットワークインターフェースを無効にした場合は確かに実行されるけれども、シャットダウンや再起動時には仮想マシンのネットワークが何故か無効にならない。まるで原因がわからないからもうsystemdで以って対応した。

$ sudo vi /etc/systemd/system/ipt-save.service
[Unit]
Description=Save and restore iptables rules.
After=network.target
Before=shutdown.target reboot.target
Requires=network.target

[Service]
Type=simple
ExecStart=/bin/sh -c '/sbin/iptables-restore -c < /etc/iptables.conf'
ExecStop=/bin/sh -c '/sbin/iptables-save -c > /etc/iptables.conf'
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

ExecStartやExecStopの項目ではリダイレクト記号を裸で記述すると、実行時には無いものとして振る舞っていた。シングルクォーテーションの包囲内であれば有効であった。あとはユニットを有効にして終いである。

$ sudo /bin/sh -c '/sbin/iptables-save -c > /etc/iptables.conf'
$ sudo systemctl enable ipt-save.service
$ systemctl status ipt-save.service
 ipt-save.service - Save and restore iptables rules.
   Loaded: loaded (/etc/systemd/system/ipt-save.service; enabled; vendor preset: enabled)
   Active: active (exited) since Tue 2018-10-02 21:51:22 JST; 29min ago
(snip)

networkd-dispatcherは思い通りにならないしsystemdはなんだかとっつき難いし偉いものに首を突っ込んでしまったという心持ちである。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください