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/
配下のスクリプトであるという。
ところが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はなんだかとっつき難いし偉いものに首を突っ込んでしまったという心持ちである。