内核 3.10 的 IPv6 邻居发现/路由失败

内核 3.10 的 IPv6 邻居发现/路由失败

愚蠢的错误导致了这一切,请阅读更新 5

介绍

我正在尝试设置带有 IPv6 的 Linux 路由器(LXC,3.10.0-123.el7.x86_64)。

提供商是 Hetzner,我有 2 个子网,一个 /56 和一个 /64。他们已设置到我的 LL 地址的路由,我的默认网关是 fe80::1。

我已在以下位置启用了 ipv6 和 ipv4 转发sysctl.conf

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

并且我将 IPTables 配置为接受所有内容。

我知道这ICMPv6是 IPv6 中用于路由的主要实用程序 - 因此它没有被阻止 ;-)。我还添加了-A FORWARD -j ACCEPT

我已将 /56 子网的第二个 (::2) ip 配置为 eth1,并将 /64 的第二个 (::2) ip 配置为 eth0。

  • eth0 是上行接口
  • eth1 是 LAN 接口

主要问题

具有来自 /56 的 ipv6 地址的内部客户端无法 ping 通外部世界,但数据包和响应被正确路由到我的路由器,路由器只是在没有任何提示的情况下丢弃数据包。

例如ping6 ipv6.google.com导致超时。

但在路由器的上行链路上我得到:

20:43:13.350932 IP6 client-ipv6-ip > fra07s64-in-x00.1e100.net: ICMP6, echo request, seq 1, length 64
20:43:13.355143 IP6 fra07s64-in-x00.1e100.net > client-ipv6-ip: ICMP6, echo reply, seq 1, length 64
20:43:14.350572 IP6 client-ipv6-ip > fra07s64-in-x00.1e100.net: ICMP6, echo request, seq 2, length 64
20:43:14.354609 IP6 fra07s64-in-x00.1e100.net > client-ipv6-ip: ICMP6, echo reply, seq 2, length 64
20:43:15.350630 IP6 client-ipv6-ip > fra07s64-in-x00.1e100.net: ICMP6, echo request, seq 3, length 64
20:43:15.355072 IP6 fra07s64-in-x00.1e100.net > client-ipv6-ip: ICMP6, echo reply, seq 3, length 64
20:43:16.350656 IP6 client-ipv6-ip > fra07s64-in-x00.1e100.net: ICMP6, echo request, seq 4, length 64
20:43:16.354748 IP6 fra07s64-in-x00.1e100.net > client-ipv6-ip: ICMP6, echo reply, seq 4, length 64

在客户端,只有回显请求可见。

可能是什么问题?是否有其他设置可以让我的路由器接受发送给它的任何内容?

到目前为止,我只在我的 Linux 机器上使用过 NAT,从未使用过完整的路由。

感谢您的任何指点,我希望这只是一个简单的 sysctl 参数设置...

更新 1

我用“subnet-2”替换了 /56 子网,用“subnet-1”替换了 /64 子网。

ip -6 a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
61: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 subnet-1::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:2eff:fe01:1/64 scope link 
       valid_lft forever preferred_lft forever
63: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 subnet-2::2/56 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe01:1/64 scope link 
       valid_lft forever preferred_lft forever

ip -6 r

unreachable ::/96 dev lo  metric 1024  error -101
unreachable ::ffff:0.0.0.0/96 dev lo  metric 1024  error -101
unreachable 2002:a00::/24 dev lo  metric 1024  error -101
unreachable 2002:7f00::/24 dev lo  metric 1024  error -101
unreachable 2002:a9fe::/32 dev lo  metric 1024  error -101
unreachable 2002:ac10::/28 dev lo  metric 1024  error -101
unreachable 2002:c0a8::/32 dev lo  metric 1024  error -101
unreachable 2002:e000::/19 dev lo  metric 1024  error -101
subnet-1::/64 dev eth0  proto kernel  metric 256 
subnet-2::/56 dev eth1  proto kernel  metric 256 
unreachable 3ffe:ffff::/32 dev lo  metric 1024  error -101
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth1  proto kernel  metric 256 
default via fe80::1 dev eth0  metric 1024 

系统已更新,但内核除外(例如,内核未加载),因为这需要重新启动,而我目前没有遇到过问题。但如果这是 3.10.0-123.13.2.el7 的已知问题,我可以重新启动以将其升级到 3.10.0-229.14.1.el7。

更新 2

tcpdump -i eth0 ip6 

显示传入数据包。

我添加了防火墙规则来破坏例如

*mangle
-A PREROUTING -j NFLOG

登录到/var/log/messages,但那里什么也没有记录!

更新 3

    Bridge "br0"
        Port "router.eth0"
            Interface "router.eth0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "eth0"
            Interface "eth0"
    Bridge "br1"
        Port "db01.eth0"
            Interface "db01.eth0"
        Port "mail01.eth0"
            Interface "mail01.eth0"
        Port "br1"
            Interface "br1"
                type: internal
        Port "team1"
            Interface "eth3"
            Interface "eth2"
        Port "router.eth1"
            Interface "router.eth1"

更新 4

我搞砸了,接口上的 MAC 地址是错误的(长话短说 - 现在已经修复了)。

因此现在数据包被接受并转发,但是响应没有发送到默认网关:

路由器:

22:09:22.638405 IP6 ping_ip > client_ip: ICMP6, echo request, seq 243, length 64
22:09:22.754936 IP6 router-ll > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has fe80::1, length 32
22:09:22.757001 IP6 2a01:4f8::a:b:10 > router-ll: ICMP6, neighbor advertisement, tgt is fe80::1, length 32
22:09:22.757044 IP6 router-ll > ff02::1:ff00:2: ICMP6, neighbor solicitation, who has router-ll, length 32
22:09:23.639651 IP6 ping_ip > client_ip: ICMP6, echo request, seq 244, length 64
22:09:23.756969 IP6 router-ll > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has fe80::1, length 32
22:09:23.759007 IP6 router-ll > ff02::1:ff00:2: ICMP6, neighbor solicitation, who has router-ll, length 32
22:09:23.759240 IP6 2a01:4f8::a:b:10 > router-ll: ICMP6, neighbor advertisement, tgt is fe80::1, length 32
22:09:24.640677 IP6 ping_ip > client_ip: ICMP6, echo request, seq 245, length 64

客户:

22:11:41.640978 IP6 ping_ip > client_ip: ICMP6, echo request, seq 382, length 64
22:11:41.640998 IP6 client_ip > ping_ip: ICMP6, echo reply, seq 382, length 64
22:11:42.642993 IP6 ping_ip > client_ip: ICMP6, echo request, seq 383, length 64
22:11:42.643013 IP6 client_ip > ping_ip: ICMP6, echo reply, seq 383, length 64

ip -6 neigh

fe80::216:3eff:fe01:1 dev eth1 lladdr 00:16:3e:01:00:01 router STALE
subnet-2::1:1 dev eth0  FAILED
fe80::216:3eff:fe15:1 dev eth1 lladdr 00:16:3e:15:00:01 DELAY
fe80::216:3eff:fe15:c dev eth1 lladdr 00:16:3e:15:00:0c STALE
fe80::1 dev eth0  FAILED
subnet-2::1:1 dev eth1 lladdr 00:16:3e:15:00:01 REACHABLE
fe80::216:2eff:fe01:1 dev eth0  INCOMPLETE
subnet-2::1:12 dev eth1 lladdr 00:16:3e:15:00:0c STALE
subnet-1::2 dev eth0  FAILED

这里之所以出现 1:1 的失败条目,是因为我之前曾在 eth0 上短暂地使用过该地址来调试 ping 问题...

更新 5

因此,在更改 MAC 地址时,我并没有更改 LL 地址。我不知道这两个地址是 100% 关联的。

主要问题是旧路由器坏了,我从那里复制了 LL 地址,但没有改变相应的 MAC 地址 → 它不起作用。

然后...将 LL 改回(这是错误)并更改 MAC 地址(分为两个单独的步骤,相隔几个小时)。

对于其他任何人来说,L2 MAC 和 IPv6 LL 地址都需要对应,并且它们需要与路由器发送的内容相匹配。

为了进行调试使用tcpdump -i eth0 ip6 -en,您可以查看 MAC 地址和 LL 地址,并将它们与您的接口进行比较,如果其中任何一个与在 Hetzner 上配置为路由地址的地址不匹配,则什么都不起作用!

所以,再次向所有读到这篇文章的人表示歉意,不知何故我忘了解释一下,之前它是在另一个路由器上,我安装这个是因为上一个路由器坏了。明显的解决办法...

答案1

如果您遇到数据包丢失的奇怪路由问题,请按照以下步骤操作:

ip l并记下 MAC 地址

tcpdump -en -i eth0 ip6(或相应的接口)并进行比较,如果它们匹配,则一切正常

ip -6 a将链接本地地址(范围本地)与您的 mac 地址进行比较(这里有一个计算器:http://ben.akrin.com/?p=1347,有几个)

如果仍然不起作用,我猜问题出在 iptables 上,尽可能使用日志记录:)

相关内容