2018年10月一覧

Ubuntu18.04のnetplanでIPアドレスのないブリッジが有効化しない事象の回避

KVMで仮想マシンを繋ぐ場合などにIPアドレスのないブリッジを作成することがある。
しかし、記事編集時点でUbuntu18.04とnetplanの組み合わせではそのようなブリッジが手動でないと有効化(UP)しないバグがある。

(参考) netplan does not bring up anonymous bridge on boot

参考元に回避方法についても言及しているコメントが有り、忘れないようにメモしておく。

事象の例

netplanを以下のように設定したとする。

/etc/netplan/01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: yes
      dhcp6: no

  vlans:
    vlan.10:
      id: 10
      link: ens3
      dhcp4: no
      dhcp6: no

    vlan.20:
      id: 20
      link: ens3
      dhcp4: no
      dhcp6: no

  bridges:
    br.10:
      interfaces: [vlan.10]
      dhcp4: no
      dhcp6: no

    br.20:
      interfaces: [vlan.20]
      dhcp4: no
      dhcp6: no

[netplan apply]や再起動をした場合に以下の様になり、br.10/br.20がDOWNのままとなる。

test@test:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.103/24 brd 192.168.40.255 scope global dynamic ens3
       valid_lft 259170sec preferred_lft 259170sec
3: br.20: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 16:80:32:d9:a0:9d brd ff:ff:ff:ff:ff:ff
4: br.10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether d2:c0:53:11:b5:10 brd ff:ff:ff:ff:ff:ff
5: vlan.10@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br.10 state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
6: vlan.20@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br.20 state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff

手動でbr.10を有効化する

sudo ip link set br.10 up

問題なくbr.10が有効化される

test@test:~$ ip a
---略---
3: br.20: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 16:80:32:d9:a0:9d brd ff:ff:ff:ff:ff:ff
4: br.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d2:c0:53:11:b5:10 brd ff:ff:ff:ff:ff:ff
---略---

回避方法

systemdに以下のようなnetworkの設定ファイルを作成
「Name」行をブリッジ名に合わせて作成、ワイルドカードも使えるらしいので今後も増える場合は命名規則を決めてそちらで指定したほうがいいかも。

cat <<'EOF' | sudo tee -a /etc/systemd/network/10-netplan-brUp.network
[Match]
Name=br.10
Name=br.20

[Network]
LinkLocalAddressing=no
ConfigureWithoutCarrier=true
EOF

この状態で設定を適用してみる

sudo netplan apply

ブリッジが有効化される

test@test:~$ ip a
---略---
3: br.20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 16:80:32:d9:a0:9d brd ff:ff:ff:ff:ff:ff
4: br.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d2:c0:53:11:b5:10 brd ff:ff:ff:ff:ff:ff
---略---

Ubuntu18.04で再起動時にsysctlでIPv6を無効化する

記事編集時点で、Ubuntu18.04はバグのせいでsysctlでIPv6を無効化する設定をしてもそのままでは再起動時に読み込んでくれない。

(参考)Using sysctl to permanently disable IPv6 doesn’t have any effect

GRUBにIPv6モジュールを読み込まないよう設定する方法もあるが、モジュールを必要とするアプリケーションで不具合が出ることもあるので、なるべくsysctlを利用して回避する方法を探したら以下の解決方法があった。

(参考)Disable IPv6 on Ubuntu 18.04

参考元のほぼ丸パクリとなるが、備忘の意味も含めて手順をメモしておく。

sysctlでIPv6の無効化設定

何もしてない時点でのアドレス状態
「inet6」がある

test@test:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.105/24 brd 192.168.40.255 scope global dynamic noprefixroute ens3
       valid_lft 258652sec preferred_lft 258652sec
    inet6 fe80::52da:7f99:1e89:4171/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

sysctlを設定

# 設定ファイルの作成
cat <<'EOF' | sudo tee -a /etc/sysctl.d/70-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF

# 反映
sudo sysctl --system

設定後のアドレス状態
「inet6」がない

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.105/24 brd 192.168.40.255 scope global dynamic noprefixroute ens3
       valid_lft 258250sec preferred_lft 258250sec

これだけではバグで再起動した際に反映されないので、以下の手順も行う。

OS起動後にsysctl設定を再適用するスタートアップスクリプトを作成

# スタートアップスクリプトを作成
cat <<'EOF' | sudo tee -a /etc/rc.local
#!/bin/bash
# /etc/rc.local

# Load kernel variables from /etc/sysctl.d
/etc/init.d/procps restart

exit 0
EOF

#実行権限を付与
sudo chmod 755 /etc/rc.local

これで再起動して、IPv6アドレスがなければOK。

本来IPv6も使えるようにしておくべきだが、アプリケーション側で不具合の原因になったり、セキュリティやメンテナンスや設備でコスト増になったりするのでしょうがないんや…