![内核 3.10 的 IPv6 邻居发现/路由失败](https://linux22.com/image/669895/%E5%86%85%E6%A0%B8%203.10%20%E7%9A%84%20IPv6%20%E9%82%BB%E5%B1%85%E5%8F%91%E7%8E%B0%2F%E8%B7%AF%E7%94%B1%E5%A4%B1%E8%B4%A5.png)
愚蠢的错误导致了这一切,请阅读更新 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 上,尽可能使用日志记录:)