路由器的 6in4 隧道,部分成功

路由器的 6in4 隧道,部分成功

我的 ISP 不向客户端提供 IPv6 地址(只有一个 IPv4)。我有一个专用服务器,具有静态 IPv4 地址和 /64 阻止 IPv6,因此我决定自己做隧道代理(6in4)。是的,我可以使用 tunnerbroker.net,但我想学习如何自己做。

目标:从具有本机 IPv4+IPv6(eth0)连接的服务器到仅具有 IPv4 的家庭路由器后面的客户端提供 6in4 隧道。

我做了什么:

服务器端:

ip tunnel add sit5 mode sit ttl 255 remote [home_router_ipv4] local [server_ipv4]
ip link set dev sit5 up
ip -6 addr add [ipv6]::1/64 dev sit5
ip -6 route add [ipv6]::/64 via [ipv6]::2 dev sit5 metric 1
ip -6 neigh add proxy [ipv6]::2 dev eth0

系统控制:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv4.conf.all.accept_redirects=0
net.ipv6.conf.all.accept_redirects=0
net.ipv4.conf.all.send_redirects=0

客户端:

运行 DD-WRT 的路由器原生支持 6in4 隧道,并使用 radvd 将地址传播到客户端(已在 tunnelbroker.net 上成功测试)。

radvd 配置:

interface br0
{
 IgnoreIfMissing on;
 AdvSendAdvert on;
 MinRtrAdvInterval 3;
 MaxRtrAdvInterval 10;
 AdvHomeAgentFlag off;
 AdvManagedFlag off;
 AdvOtherConfigFlag on;
 AdvLinkMTU 1480;
 prefix [ipv6]::/64
 {
  AdvOnLink on;
  AdvAutonomous on;
 };
 RDNSS [ipv6]::1 2620:0:ccd::2 {};
};

问题:路由器通过隧道正确连接到 IPv6 网络(它可以浏览 IPv6 网络),但客户端却没有(它们收到正确的 IPv6 地址,但无法 ping 通任何东西,包括路由器和服务器)。

当我从服务器到客户端执行 traceroute6 时,我遇到了路由循环:

# traceroute6 [ipv6]:4d34:1981:aba6:620c
traceroute to [ipv6]:4d34:1981:aba6:620c ([ipv6]:4d34:1981:aba6:620c) from [ipv6]::1, 30 hops max, 24 byte packets
 1  [ipv6]::2 ([ipv6]::2)  43.446 ms  44.439 ms  39.687 ms
 2  [ipv6]::1 ([ipv6]::1)  41.955 ms  41.391 ms  43.225 ms
 3  [ipv6]::2 ([ipv6]::2)  80.456 ms  80.515 ms  81.893 ms
 4  [ipv6]::1 ([ipv6]::1)  81.966 ms  83.338 ms  92.166 ms
    ...

答案1

第一个问题是你在两个地方使用了同一个子网——你的 LAN 和 p2p 隧道。虽然这在经过一些路由争论后可能会奏效,但实际上不是一个好主意。

(请注意 Tunnelbroker 如何为您分配两个子网:一个 /64 纯粹用于点对点链接,加上一个用于 LAN 的“路由”子网。)

因此,如果您只有一个 /64,请仅将其用于 LAN。p2p 隧道将与链路本地寻址配合使用(或者实际上根本没有寻址,因为它是 p2p 链路)。

因此,不要使用这些命令...

ip -6 addr add [ipv6]::1/64 dev sit5
ip -6 route add [ipv6]::/64 via [ipv6]::2 dev sit5 metric 1

使用这样的方法:

ip -6 addr add fe80::1/64 dev sit5
ip -6 route add [ipv6]::/64 via fe80::2 dev sit5

甚至是完全没有编号的链接:

# <no 'addr add' necessary>
ip -6 route add [ipv6]::/64 dev sit5

当然,要相应地配置家庭路由器——在这个例子中,它有地址fe80::2/64并用作fe80::1网关。

笔记:上述方法不一定是完整的解决方案。我怀疑你可能在同时连接多个网络(LAN、p2p 和服务器自己的 eth0),这可能需要比平常更多的创可贴。


第二个问题是,据我了解,您的服务器提供商将 /64 配置为链接上子网,而不是路由将其传送至服务器。

这是一个相当烦人的问题(不幸的是,这很常见)——on-link 意味着你的服务器必须代理邻居发现每一个地址您的 LAN 设备使用的;

所以你的路由器本身由于您使用了以下命令,因此可以访问 Internet:

ip -6 neigh add proxy [ipv6]::2 dev eth0

但是您必须对每台设备重复此操作,更不用说您的电脑可能使用的临时生成的“隐私”地址。

最好你的服务器提供商可以重新配置 /64 为路由向您的服务器(也许通过电子邮件或票证询问他们) - 这将使 ND 代理完全没有必要。

如果这不可能的话,您可能必须运行ndppdND 代理整个 /64。


最后,依赖 Tunnelbroker 或 NetAssist 可能会更容易。

相关内容