Ubuntu Server 18.04(Bionic Beaver)でトンネルインターフェースを定義する

2019.02.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。
最近のUbuntu Serverではネットワーク構成をYAMLでかっこよく定義するNetplanへの移行が進んでいますが、18.04(Bionic Beaver)でトンネルインターフェースをNetplanで定義しようとしたら出来なかったのでその様子を共有します。

Bionic BeaverのNetplanはトンネルインターフェース非対応だった。

NetplanはCanonical社が開発するネットワーク構成の仕組みで、現在はNetworkManager(Wi-Fi)とSystemd(有線LANその他)をサポートしています。設定をYAMLで書けるので、Cloud-initやCloudFormationと組み合わせて使うと便利そうですね。

今回トンネルインターフェースを定義しようとドキュメントを参考に設定したのですが、以下のエラーで正しく設定できませんでした。

$ sudo netplan apply
Error in network definition //etc/netplan/50-cloud-init.yaml line 6 column 4: unknown key tunnels
$

Bionic BeaverのNetplanはバージョン0.36.3で、tunnelsをサポートするバージョン0.95より古いことが原因でした。

$ dpkg -l netplan.io
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-===============================================
ii  netplan.io            0.36.3          amd64           YAML network configuration abstraction for vari

Ubuntu向けに配布しているnetplan.ioパッケージでバージョン0.95以降のものを見つけられなかったので、Netplanでの設定は一旦諦めます。

ならばsystemd-networkdだ

仕方なく伝統的な/etc/network/interfacesファイルでやろうと中身を見てみると

$ cat /etc/network/interfaces
# ifupdown has been replaced by netplan(5) on this system.  See
# /etc/netplan for current configuration.
# To re-enable ifupdown on this system, you can run:
#    sudo apt install ifupdown

連れない感じでした。そこで思い出したのが、NetplanはバックエンドでSystemdを使っていることでした。以下のようにSystemdでトンネル設定を書いてみます。今回はGREのL2トンネル2本を張ってみました。

/etc/systemd/network/ens5.network

[Network]
Tunnel=gretapA
Tunnel=gretapB

/etc/systemd/network/gretapA.netdev

[NetDev]
Name=gretapA
Kind=gretap

[Tunnel]
Remote=100.64.159.132

/etc/systemd/network/gretapA.netdev

[NetDev]
Name=gretapB
Kind=gretap

[Tunnel]
Remote=100.64.159.4

あとはSystemdの設定を読み込ませて動作を確認します。

$ sudo systemctl restart systemd-networkd
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 0e:cd:ed:52:c3:a2 brd ff:ff:ff:ff:ff:ff
3: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/gre 0.0.0.0 brd 0.0.0.0
4: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
5: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
6: gretapA@lo: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65498 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether da:13:ac:5c:83:4e brd ff:ff:ff:ff:ff:ff
7: gretapB@lo: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65498 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 7e:59:8c:c9:31:28 brd ff:ff:ff:ff:ff:ff

設定出来ていますね。Netplanと競合しないかヒヤヒヤしていましたが、OSの再起動後も同様の設定になっていたので今のところ問題無さそうです。

まとめ

Ubuntu Server 18.04(Bionic Beaver)でトンネルインターフェースを定義する方法として、Systemdでの設定方法をご紹介しました。新しめの機能は、旧来の方式と組み合わせることがよくあると思うので、その一例としてお役に立てば幸いです。

参考URL