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/iptables.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 iptables.service $ systemctl status iptables.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はなんだかとっつき難いし偉いものに首を突っ込んでしまったという心持ちである。
参考:
Use pre-up, post-up, etc. hook scripts
clayton craft / networkd-dispatcher・GitLab
Ubuntu Manpage: networkd-dispatcher – Dispatcher service for systemd-networkd connection status changes