仮想マシン再起動時に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/ 配下のスクリプトであるという。

Netplan frequently asked questionsによる

ところが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

netplanによってネットワークインターフェース名を変更

OS: Ubuntu Server 18.04 LTS
Shuttle XS35V2
BUFFALO 有線LANアダプター LUA4-U3-AGT

ShuttleのXS35V2にUbuntuの再インストールを試みたもののネットワークカードをちっとも認識してくれないのでひどく困っていたところ、USB接続の有線LANアダプタで以ってネットワークへの接続がすんなり成功してすっかり良かった。けれどもネットワークインターフェース名がenx00005e005300などという具合に途方もなく長くて改めて困ったものである。enxにMACアドレス00:00:5e:00:53:00が引っ付いた形式でまことに覚え辛い。

$ ifconfig
enx00005e005300: flags=4163  mtu 1500
        inet 192.168.0.150  netmask 255.255.255.0  broadcast 192.168.0.255

こういうことでは扱いがむつかしいのでインターフェース名を変更したい心持ちである。そこで設定ファイルにmatchルールとset-name:プロパティを用いればよいということである。MACアドレスが00:00:5e:00:53:00にマッチしたらインターフェース名をeth1にセットするという要求であればこういう具合に設定する。

$ sudo vi /etc/netplan/config.yaml
network:
    ethernets:
        enx00005e005300:
            match:
                macaddress: 00:00:5e:00:53:00
            set-name: eth1
            addresses:
            - 192.168.0.150/24
            dhcp4: false
            gateway4: 192.168.0.1
            nameservers:
                addresses:
                - 192.168.0.1
                search: []
    version: 2

あとはnetplan tryコマンドで設定が正しく記載されたか慎重に確認しながら反映をする。MACアドレスの形式に誤りがあれば Invalid MAC address '00:00:5e:00:53:0', must be XX:XX:XX:XX:XX:XX という風情のエラーが現れるから妙な設定が適用される恐れが無くて堅い。

$ sudo netplan try --timeout 10
(snip)
Changes will revert in  9 seconds
Configuration accepted.

設定ファイルは受け入れられたけれどもマシンを再起動せずに内容を反映させるにはどうしたら良いのか奮闘の結果ついに分からなかったので渋々マシンを再起動してどうにかインターフェース名を変更した。

$ sudo reboot
$ ifconfig
eth1: flags=4163  mtu 1500
        inet 192.168.0.150  netmask 255.255.255.0  broadcast 192.168.0.255

参考:
Device Configuration IDs

netplanを用いてIPアドレスをセットする

OS: Ubuntu Server 18.04, Ubuntu Desktop 18.04

Ubuntu 18.04を導入して取り扱っているとネットワークの設定方法がすっかり様変わりしている模様である。近頃は/etc/network/interfacesを編集して設定をするのではなくnetplanとか言う名前のツールを用いたり/etc/netplan内に設定を記したYAMLファイルを放り込む手口に変わっている。仮にconfig.yamlという風に名付けて設定ファイルを用意する。

$ sudo vi /etc/netplan/config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      addresses: [192.168.0.30/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [192.168.0.1, 8.8.8.8]

rendererはNetworkManagerかnetworkdから選択する。デフォルトはnetworkdであってだいたいこれで困らないとおもう。IPアドレスはCIDR表記できるので以前のように255.255.255.0などと打ち込む手間から開放されて良いことである。YAMLファイルを作成したらnetplanコマンドで以って内容を反映させる必要があるという。記述に自信があるならnetplan applyで一息に反映させられるけれどもネットワーク越しに作業をしているなら誤った設定がセットされ接続が失われコンソールまで慌てて駆けつける必要に迫られる恐れがあるからtryコマンドを使うのが安心である。

$ sudo netplan try --timeout 10
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in  1 seconds
Reverting.

10秒間Enterキーが押下されなければ反映は取りやめて以前の設定に戻してくれる。--timeoutを指定しなければデフォルトでは120秒間の猶予期間を設けるようである。あとは今風なやりかたでIPアドレスを確認するとこういう具合である。

$ ip address show ens33
(snip)
2: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:61:28:2a brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.30/24 brd 192.168.0.255 scope global ens33

ip address showと多数の文字をいちいち打ち込むのがひち面倒であるなら省略してip a sまで縮めることができる。IPアドレスに加えてDNSサーバーの設定を確認するとなればこれも今どきは/etc/resolv.confの中身を開くのではなくコマンドでやるようである。

$ systemd-resolve --status
(snip)
Link 2 (ens33)
(snip)
         DNS Servers: 192.168.0.1
                      8.8.8.8

参考:
Netplan reference
Netplan configuration examples