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

Tho*_*ein 5 linux routing ipv6 lxc

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


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

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

我在 sysctl.conf 中启用了 ipv6 和 ipv4 转发:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
Run Code Online (Sandbox Code Playgroud)

我将 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
Run Code Online (Sandbox Code Playgroud)

在客户端上只有回显请求是可见的。

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

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

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


更新 1

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

ip -6 一个

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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

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


更新 2

tcpdump -i eth0 ip6

显示传入的数据包

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

*mangle
-A PREROUTING -j NFLOG
Run Code Online (Sandbox Code Playgroud)

登录到/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"
Run Code Online (Sandbox Code Playgroud)

更新 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
Run Code Online (Sandbox Code Playgroud)

客户:

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
Run Code Online (Sandbox Code Playgroud)

ip -6 邻居:

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
Run Code Online (Sandbox Code Playgroud)

1:1 的失败条目在这里是因为我很快在 eth0 上有了那个地址来调试之前的 ping 问题......


更新 5

因此,在更改 mac 时,我没有更改 LL 地址。我不知道这两个地址是 100% 链接的。

主要问题是旧路由器死了,我从那里复制了 LL 地址并没有更改相应的 mac -> 它不起作用。

然后......将LL改回(这是错误的)并更改了mac(在相隔几个小时的两个单独步骤中)。

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

要调试使用,tcpdump -i eth0 ip6 -en然后您可以看到mac和ll地址并将它们与您的接口进行比较,如果其中有任何一个,并且在Hetzner配置的路由地址不匹配,则不起作用!

再次,对于阅读该内容的任何人,我很抱歉,我不知何故未能解释它之前在另一台路由器上,我安装了这个,因为最后一个死了。明显的修复...

Tho*_*ein 3

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

ip l并记下 MAC 地址

tcpdump -en -i eth0 ip6(或者对应的接口)并进行比较,如果都匹配则为好

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

如果仍然无法正常工作,我猜问题出在 iptables 上,请尽可能使用日志记录:)