我无比怀念 Ubuntu 还在用 ifupdown 的年代,netplan.io 什么垃圾玩意。
起因是这样的,看阿里云打折,所以买了一个轻量 HK 来玩。阿里云的机器嘛,拿到手第一件事肯定是跑脚本重装系统,然后就默认装了最新的 Ubuntu 18.04。接下来发现,这机器没有 IPv6,于是就打算配置一下 HE Tunnelbroker,这时候问题就出现了,18.04 默认已经没有 ifupdown 而改用 netplan.io,HE 也没有提供 netplan 的样例配置。考虑到用新不用旧的原则(类比 systemd 和 Ubuntu upstart/update-rc.d),于是想折腾一下 netplan。
netplan 官网上宣称,它可以配置 6in4 Tunnel,还在官方示例(https://netplan.io/examples)最下面给出了对应的语法,然而在最新的 Ubuntu 内置版本上,tunnels 这个关键字根本不识别。查询 bug 发现在 https://bugs.launchpad.net/netplan/+bug/1799487 这里有人提到 netplan 无法使用 6in4 tunnel 的问题,也提出了一个使用 systemd-networkd 的解决方案。netplan 的 tunnel 支持根据这个 bug report 的说法,已经在一月初 commit,可能还没合并到软件包的版本里面吧。
阿里云的镜像,默认的网络配置是在 /etc/netplan/01-netcfg.yaml 中,默认是 DHCPv4 的方式获取内网 IP。我们先通过这里看到 v4 interface 的名称,比如 ens3。之后创建如下文件:
/etc/systemd/
[NetDev] Name=he-ipv6 Kind=sit MTUBytes=1480 [Tunnel] Local=<local IPv4 address> # should be the internal IPv4 address on Aliyun instead of the public IPv4 address Remote=<tunnel server IPv4 address> TTL=64
/etc/systemd/
[Match] Name=he-ipv6 [Network] Address=<Client IPv6 Address>/64 Gateway=<Server IPv6 Address>
/etc/systemd/
e.g. /etc/systemd/
[Network] Tunnel=he-ipv6
表示在默认的 v4 interface 上创建 tunnel。之后 systemctl restart systemd-networkd 即可
或者也可以使用 ip 命令在一个 systemd service 中完成添加:
[Unit] Description=he.net IPv6 tunnel After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/ip tunnel add he-ipv6 mode sit remote <server IPv4 address> local <client IPv4 address> ttl 255 ExecStart=/sbin/ip link set he-ipv6 up mtu 1480 ExecStart=/sbin/ip addr add <client IPv6 address> dev he-ipv6 ExecStart=/sbin/ip -6 route add ::/0 dev he-ipv6 ExecStop=/sbin/ip -6 route del ::/0 dev he-ipv6 ExecStop=/sbin/ip link set he-ipv6 down ExecStop=/sbin/ip tunnel del he-ipv6 [Install] WantedBy=multi-user.target