技术解析
https://chaoticvoid.net/posts/systemd-network-interface-naming/
踩到这个坑的起源是在 Vultr 上开了一个 Debian 9 的机器,运行过初始化脚本,结果发现脚本中的 iptables 规则没有生效。检查了规则,一切正常; ifconfig 后发现问题所在:
ens3: flags=4163 mtu 1500
inet x.x.x.x netmask 255.255.254.0 broadcast x.x.x.x
inet6 x::x:x:x:x prefixlen 64 scopeid 0x20
ether 56:00:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 172 bytes 19821 (19.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 175 bytes 18906 (18.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
网卡名称竟然不是 eth0。好吧,“竟然”这个词用的不准确。这两年用 Linux 作为自己唯一桌面系统,早就发现网卡名称变了。之前折腾用的虚拟机用的都是 CentOS 7,自己 kickstart 出来的虚拟机模板和 DigitalOcean 上的机器网卡名都是 eth0,就默认 Debian 9 也是了。
搜索一番找到了源头,systemd 在 v197 之后采用了区别与 ethX 的新命名策略[1]。传统命名策略的缺陷在于在多网卡情况下会出现重启后网卡命名混乱,比如之前的 eth0 和 eth1 换了名字。贫穷限制了我的想象力。细读下来还发现 Debian 和 CentOS/Fedora 用的竟然还是不同的新的命名策略,有心的可以自己试试。这套新的命名策略在 VPS 上显然没有意义。
解决方案:
[1] https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/