我正在寻找一种与 rdisc6 非常相似的工具,该工具在收到 RA 后,将使用静态 IID 在接口上配置 v6 地址。这是一台需要位于 ULA 内已知地址的服务器。(不,我不能使用 mDNS 和 SLAAC,因为涉及与名称绑定的证书,并且 mDNS 甚至可能在配置此接口之前都无法工作)。
如果必须,我将扩展 rdisc6,但我希望不要重复别人已经做过的事情。它将在 LXC 容器内的 Linux(armv7)上运行。
答案1
您应该能够为此使用 IPv6 令牌。IPv6 令牌是手动设置的 IID,无论通过 SLAAC 分配的 IPv6 前缀如何,它都保持不变。使用 IPv6 令牌需要 SLAAC。
您可以通过在 NetworkManager 中设置接口属性来持久配置令牌。
# nmcli c mod enp4s0 ipv6.addr-gen-mode eui64
# nmcli c mod enp4s0 ipv6.token ::deca:fbad:c0:ffee
现在带有子网前缀的2001:db8:dead:beef::/64
接口将具有 IPv6 地址2001:db8:dead:beef:deca:fbad:c0:ffee
。
要删除令牌,请将其设置为空值。然后您可以将 addr-gen-mode 重置为其默认值。
# nmcli c mod enp4s0 ipv6.token ''
# nmcli c mod enp4s0 ipv6.addr-gen-mode stable-privacy
使用 systemd-networkd ,IPv6Token=
在[Network]
配置。
您也可以ip token
手动运行该命令。对于配置容器,这可能是您最终要做的事情。
如果您需要单个接口上的多个 IID,则必须手动设置它们。没有其他方法可以帮助您。
答案2
使用“ip token”的关键原来是接口必须down。
%sudo ifconfig lan down
%sudo ip token set ::45/64 dev lan
%sudo ifconfig lan up
%ifconfig lan
lan: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1c60:e9ff:fe26:dc74 prefixlen 64 scopeid 0x20<link>
inet6 2607:f0b0:f:e0::45 prefixlen 64 scopeid 0x0<global>
inet6 fdba:d505:5c1::45 prefixlen 64 scopeid 0x0<global>
ether 1e:60:e9:26:dc:74 txqueuelen 1000 (Ethernet)
RX packets 664833 bytes 85127613 (81.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22823 bytes 3091931 (2.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0