IPv6寻址、动态前缀静态本地部分

IPv6寻址、动态前缀静态本地部分

我网络上的路由器分发由 ISP 分配的 IPv6 前缀。这个前缀是动态的,但“相当粘”。

我希望我的机器能够自动获取 RA 中公布的前缀,但将其与用户指定的本地部分相结合,而不是随机生成或基于 MAC 地址生成前缀。有什么简单的方法可以做到这一点吗?

答案1

有两种方法可以做到这一点。一种是简单的方法,一种是困难的方法。

最简单的方法是在网络上运行 DHCPv6 服务器并自行为每个设备分配主机地址。或者让服务器选择主机部分;我见过的 DHCPv6 服务器即使前缀发生变化也会保留相同的主机部分。

困难的方法是使用ip token设置标记化接口标识符。这被描述为:

IPv6 标记化接口标识符支持用于将众所周知的主机部分地址分配给节点,同时仍然从路由器通告中获取全局网络前缀。令牌化标识符的主要目标是通常手动配置地址的服务器平台,而不是使用 DHCPv6 或 SLAAC。通过使用标记化标识符,主机仍然可以使用 SLAAC 确定其网络前缀,但如果其网络前缀发生变化,则更容易自动重新编号。令牌化 IPv6 标识符在草案中进行了描述:<draft-chown-6man-tokenized-ipv6-identifiers-02>。

这是困难的原因是,虽然 Linux 包含此功能,但据我所知,没有任何 Linux 发行版包含对使此类配置持久化并在启动时应用它的支持,就像它们对手动或 DHCP 配置地址所做的那样。因此,在某些发行版这样做之前,它可能不会很好地为您工作。请注意,现在可以在 NetworkManager 和 systemd-networkd 中配置 IPv6 令牌;最近的答案有具体的配置说明。


最后,如果您的 ISP 偶尔会更改您的前缀,请考虑在您的网络中使用唯一本地地址。这样,您的所有设备将始终有一个永远不会改变的地址,它们可以通过该地址相互通信。一些支持 IPv6 的家庭/SOHO 路由器(例如 OpenWrt)可以选择在整个家庭网络中启用 ULA;如果家里有多台路由器,则应在连接 ISP 的路由器上启用此功能。

答案2

Michael 做了一个非常好的总结,plugwash 最近的提示是我在寻找 CentOS 7/RHEL(还有 systemd 和网络管理器)解决方案几个小时后能找到的最好的提示。习惯 nmcli 后(我主要仍在使用 ifcfg 和 ip) - 我可以成功应用它。

但根据更深入的挖掘https://developer.gnome.org/NetworkManager/stable/settings-ipv6.htmlNetworkManager 直接支持 IPv6 标记化接口标识符作为属性(从 2016 年 8 月 1.4 版开始)http://news.softpedia.com/news/networkmanager-1-4-adds-support-for-setting-ipv6-tokenized-interface-identifiers-507601.shtml)。

因此,您不需要将网络管理器 IPv6 设置设置为忽略,但您应该将设置设置为

nmcli connection modify eth0 ipv6.method "auto" # if not already
nmcli connection modify eth0 ipv6.addr-gen-mode "eui64" # use interface token
nmcli connection modify eth0 ipv6.token "::2"

它将写入IPV6_TOKEN=::2/etc/sysconfig/network-scripts/ifcfg-eth0 以在重新启动后继续存在。要立即应用此功能,请重新启动界面

nmcli connection up id eth0  # restart

答案3

感谢 Michael 确认 Linux 支持该功能并指出了低级命令。这个答案涵盖了如何使其在 Debian Stretch 桌面(使用 systemd 和网络管理器)上实际工作。

首先在网络管理器中编辑连接并将 IPv6 设置设置为忽略。

现在创建一个文件 /etc/NetworkManager/dispatcher.d/pre-up.d/iptoken 。该文件应由 root 拥有,权限为 755,并包含以下内容。

#!/bin/sh
ip token set ::2 dev eth0

将 eth0 替换为您想要的设备,将 ::2 替换为您想要的后缀。

答案4

在 Linux 下你可以使用systemd-network.

只需在以下位置创建一个.network文件/etc/systemd/network/somename.network

[Match]
Name=e*

[Network]
DHCP=yes
IPv6Token=::1

您可以输入完整的接口名称,而不是e*匹配以 开头的所有接口。e这将启用 DHCP{v4,v6} 并用作::1后缀。您可以选择任何 IPv6 地址,但前 64 位必须设置为零。

在此之后启用并启动systemd-networkd.service.

相关内容