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