由于邻居发现失败,Linux 6in4 隧道服务器无法正确转发 IPv6 数据包

由于邻居发现失败,Linux 6in4 隧道服务器无法正确转发 IPv6 数据包

我正在尝试在我的 VPS 上设置 6in4 隧道服务器。客户端和服务器可以互相 ping 对方的 IPv6 地址,当我尝试从客户端 ping 外部服务器时,我收到 ICMP 地址不可达错误。

但是我可以从服务器 ping IPv6 网站,没有任何问题,并且从服务器 ping 通之后,我能够在大约 30 秒内从客户端 ping 通,之后我再次收到 ICMP 地址不可达错误。

tcpdump 显示,当从服务器 ping 时,它将使用其公共 IPv6 地址发送邻居请求数据包,并正确地从网关获取邻居通告。但是当从客户端 ping 时,服务器将使用其链路本地地址发送邻居请求数据包,并且不会得到任何返回。几次尝试后,服务器将放弃并向客户端返回 ICMP 地址不可达。

我该如何解决这个问题?我知道我可以向网关添加永久邻居条目,但这很不安全,所以如果可能的话我想避免这样做。

以下是一些额外的信息:

  • 服务器操作系统:Ubuntu 13.10 Server

  • uname -aLinux 3.11.0-19-generic #33-Ubuntu SMP Tue Mar 11 18:48:34 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

  • 我的 ISP 只给了我一个 /112 块,所以我使用了npd6处理传入的邻居请求数据包

  • ip6tables 在 INPUT 和 OUTPUT 表中没有条目

tcpdump(从服务器 ping 时):

18:14:33.988952 IP6 [server's public IPv6 address] > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:14:33.989410 IP6 [gateway's IPv6 address] > [server's public IPv6 address]: ICMP6, neighbor advertisement, tgt is [gateway's IPv6 address], length 32
18:14:33.989428 IP6 [server's public IPv6 address] > google-public-dns-a.google.com: ICMP6, echo request, seq 1, length 64
18:14:34.038299 IP6 google-public-dns-a.google.com > [server's public IPv6 address]: ICMP6, echo reply, seq 1, length 64

tcpdump(从客户端 ping 时,请注意 fe80::5054:ff:fe3b:3836 是服务器的链路本地地址):

18:12:35.284184 IP [client's IPv4 address] > server: IP6 [sit tunnel address (client)] > google-public-dns-a.google.com: ICMP6, echo request, seq 1, length 64
18:12:35.284263 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:36.282458 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:37.282470 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:38.282503 IP server > [client's IPv4 address]: IP6 [sit tunnel address (server)] > [sit tunnel address (client)]: ICMP6, destination unreachable, unreachable address google-public-dns-a.google.com, length 112

从客户端 ping 之后,ip neigh服务器上的输出如下所示(删除了不相关的条目):

[gateway's IPv6 address] dev eth0  router FAILED

ip addrip -6 route(地址是匿名的):

.. snipped ..
2: eth0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet .. snipped .. scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2001:db8:aa:b::cccc:1/48 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe3b:3836/64 scope link 
       valid_lft forever preferred_lft forever

9: sit: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1472 qdisc noqueue state UNKNOWN 
    link/sit .. snipped .. peer 1.2.3.4
    inet6 2001:db8:aa:b::cccc:8001/120 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::dafb:71de/128 scope link 
       valid_lft forever preferred_lft forever

::1.2.3.4 dev sit  metric 1024 
2001:db8:aa:b::cccc:8000/120 dev sit  proto kernel  metric 256
2001:db8:aa::/48 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via 2001:db8:aa::1 dev eth0  metric 1024 

答案1

此设置从根本上来说已损坏。您需要大量黑客手段(如静态路由、代理 NDP 等)才能使其正常工作。这里没有完美的解决方案...

现在,它如何应该要做的是:

  • ISP 为您提供 /48 的 IPv6 地址空间
  • 每个 LAN 都是 /64
  • 您的服务器位于与 ISP 直接连接的 /64 上
  • 您的 ISP 为您提供了一种将前缀路由到您的服务器的方法
    • 据我所知,静态路由在 ISP 中很常见
    • 具有长期稳定租约的 DHCPv6-PD 也可能解决这个问题

相关内容