OneProvider 独服启用 dhcp6 (el9)
在 OneProvider 整了个独服(实际是转卖 Scaleway 的 Dedibox),机器到手就发了工单要求使用 IPMI 远程权限重装 Alma Linux 9。
它家的 IPv6 默认未启用,需要 DHCP 唯一标识符 才能正常获取 IP。给的说明都是基于一些老系统的配置,我用的 Alma Linux 9 并不在说明之中;且因为 el9 使用 NetworkManager,网上也找不到多少信息。
照着说明在 NetworkManager 配置了对应的 DUID 后重启服务,死活无法正常获取 IP;手动指定 IP 也无法正常路由,放弃。
最后在 Scaleway 找到了使用 systemd-networkd
的配置方案,于是试着更换网络程序后配好了。
※ 建议在有 IPMI 或 VNC 远程权限的前提下操作,避免服务器失联无法恢复。
获取 IPv6 配置
到 OneProvider 服务器后台,找到 IP Manager。如果还没有启用,选择启用 IPv6 支持。
等启用后,会得到类似下方的信息:
IPv6: 2001:bc8:dffa:59b8::/64
DUID: 00:03:00:01:29:18:a3:50:22:4a
查看环境
使用 ip a
先记录一下当前的设置,避免到时候 IPv4 都无法使用:
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: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ea:08:dc:2d:28:78 brd ff:ff:ff:ff:ff:ff
inet 163.172.58.60/24 brd 163.172.58.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 fe80::d74f:8602:a475:c3b1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
可以看到我的设备名是 eno1
,IPv4 地址是 163.172.58.60/24
。
安装
dnf install -y tmux systemd-networkd
建议后续所有操作都在 tmux
中操作,避免网络原因导致超时无法自动恢复。
tmux
准备配置文件
编辑 /etc/systemd/network/eno1.network
,放入下面一大串内容,记得按照之前获得的信息填入:
[Match]
Name=eno1
[Network]
Address=163.172.58.60/24
# IPv4 地址
DHCP=ipv6
IPv6AcceptRA=yes
Address=2001:bc8:dffa:59b8::/64
# IPv6 地址
[Route]
Gateway=163.172.58.1
# IPv4 地址,最后一位改 1
GatewayOnlink=yes
[DHCP]
ClientIdentifier=duid-only
DUIDType=link-layer
DUIDRawData=00:01:29:18:a3:50:22:4a
# DUID 去掉开头的「00:03:」部分
[DHCPv6]
UseAddress=no
WithoutRA=solicit
[IPv6AcceptRA]
DHCPv6Client=always
UseOnLinkPrefix=False
UseAutonomousPrefix=False
网络配置
确保在 tmux
会话内,执行下述指令:
systemctl stop NetworkManager ; systemctl restart systemd-networkd
如果发现网断了,可以尝试重新 SSH 进入系统。
错误恢复
如果还是无法恢复,可以在后台请求重启机器(时间长),或直接利用 IPMI 远程权限继续操作。
如果一切正常,网络连接会保持;如果希望恢复之前的状态,执行:
systemctl stop systemd-networkd ; systemctl restart NetworkManager
此时可以检查一下 DNS 配置。
打开 /etc/resolv.conf
,如果没有配置 IPv6 DNS 可以加进来:
# CloudFlare 与谷歌 DNS
nameserver 1.0.0.1
nameserver 8.8.4.4
nameserver 2606:4700:4700::1001
nameserver 2001:4860:4860::8844
测试网络
此时再执行 ip a
可以看到网卡已经获取到 IPv6 地址:
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: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ea:08:dc:2d:28:78 brd ff:ff:ff:ff:ff:ff
inet 163.172.58.60/24 brd 163.172.58.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 2001:bc8:dffa:59b8::/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::d74f:8602:a475:c3b1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
测试一下 IPv6 的联通性:
# 阿里 DNS (国内)
ping -c 1 -6 2400:3200::1
# CloudFlare DNS (国外)
ping -c 1 -6 2606:4700:4700::1001
如果正常,可以看到类似的返回内容:
PING 2606:4700:4700::1001(2606:4700:4700::1001) 56 data bytes
64 bytes from 2606:4700:4700::1001: icmp_seq=1 ttl=57 time=1.56 ms
--- 2606:4700:4700::1001 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.559/1.559/1.559/0.000 ms
使用 curl 访问 IPv6 内容也正常:
# 淘宝 (国内)
curl -6 -I https://www.taobao.com/
# CloudFlare (国外)
curl -6 -I https://1.0.0.1/
最后清理
既然能用了,那就禁用旧的服务,并让新服务开机启动:
systemctl disable NetworkManager
systemctl enable systemd-networkd
(可选)如果确信不再需要 NetworkManager,也可以删掉它:
dnf remove NetworkManager
搞定。