当使用 tunnelbroker.net 创建 IPv6 隧道时,隧道代理服务会为您分配一个客户端 IPv6 地址以在路由器上使用,并为网络中的系统分配一个路由 IPv6 网络。
但是,我没有网络:我有一个具有 IPv4 连接的单一系统,我也想为其提供 IPv6 连接。我可以使用客户端 IPv6 地址轻松配置隧道(Tunnel Broker 服务也有配置示例),这已经足够发送 IPv6 流量了。
不过,这并不理想:我正在使用客户端 IPv6 地址,该地址仅用于隧道,作为我的 IPv6 流量源地址。在更实际的方面,我无法为该地址配置 rDNS 解析,这会削弱我通过 SMTP 发送电子邮件的能力。
我想要的是发送我的 IPv6 流量,就好像它来自路由 IPv6 网络中的地址一样,即使发送流量的主机和通过隧道转发它的路由器实际上是同一个系统。有没有一种合理的方法来配置标准的 Linux (Debian) 系统来实现这一点?
您实际上可以在同一台机器上同时拥有两个地址;不需要在其他地方使用路由 /64。
将客户端地址的“首选生命周期”配置为 0(例如,
preferred_lft 0
在 iproute2 命令中),这样如果另一个地址可用,它就不会被选择用于出站数据包,同时仍然接受入站数据包。然后在任何接口上配置来自路由 /64 或 /48 的任何地址。(例如,将 2001:470:foo::1/128 分配给相同的隧道接口,或分配给
lo
,或分配给 dummy0。)即使在网络的正常使用中,“路由器”和“网络中的系统”也会重叠——路由器从它所连接的每个网络都有一个 IP 地址,并且可以自由使用其任何地址通过任何网络发送流量界面。
例如,如果您要将 2001:foo::/64 用于 eth0 上的真实网络,那么您几乎总是会为 eth0 本身分配一个来自该网络的地址(例如 2001:foo::1/64),并且路由器可以使用该地址从 sit0 发起数据包。上面的说明与此没有任何不同。
从技术上讲,由于这是一个点对点的 L3 隧道(只有一个端点,没有 L2 地址),您根本不需要分配“客户端”地址——路由器的地址永远不会参与发送转发的数据包,仅接收,而对于 PtP 隧道,您仍然可以通过在隧道的另一端接收数据包。(只有使用 ARP/NDP 的链接类型,例如以太网或模拟它的 L2 隧道,才需要地址才能将前缀路由到您。)
(类似地,对于通过 L3 隧道的传出数据包,“服务器地址”并没有真正使用,因为没有 NDP 查找——只是通过路由
dev sit0
将数据包无论如何发送到链路的另一端。)然而,对于 HE.NET 隧道,您仍然需要保留“客户端”地址,这是出于另一个原因——定期空闲检查,如果客户端几个月没有回复 ping,这将禁用隧道。