通过网桥运行 IPv6 时未收到数据包

通过网桥运行 IPv6 时未收到数据包

我有一个带有两个网络接口的设置:eth0tap0,通过br0

bridge name     bridge id               STP enabled     interfaces
br0             8000.************       no              eth0
                                                        tap0

除了的本地 IPv6 地址之外,和eth0tap0没有其他 IP 地址:eth0

2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
41: tap0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc fq_codel master br0 state DOWN group default qlen 100
    link/ether YY:YY:YY:YY:YY:YY brd ff:ff:ff:ff:ff:ff

但是,网桥有一个静态 IPv4 地址和一个无状态配置的 IPv6 地址。因为如果是eth0,我需要配置这个无状态 IPv6 地址,所以我将 的 MAC 配置tap0得大于 的 MAC eth0(因此,brctl 将选择eth0MAC 作为 MAC br0)。因此,分配给自身的 IP 地址与没有任何其他接口时选择的IP 地址br0相同。eth0

请注意,隐私扩展已被禁用(all以及任何特定界面上)。

看起来br0像这样:

42: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.X.Y/24 brd 192.168.X.255 scope global br0
        valid_lft forever preferred_lft forever
    inet6 ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ:ZZZZ/64 scope global 
        valid_lft 7123sec preferred_lft 3523sec
    inet6 fe80::ZZZZ:ZZZZ:ZZZZ:ZZZZ/64 scope link 
       valid_lft forever preferred_lft forever

因此,有一个公共 IPv6 地址和一个本地 IPv6 地址,并且公共 IPv6 地址与 MAC 地址匹配(因为它是由无状态选择的)。当我现在发送 ICMPv6 数据包时,我没有收到回复:

PING google.com(2a00:1450:4001:80e::1008) 56 data bytes
^C
--- google.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

但是,当我使用 tcpdump 检查时,我看到服务器和我的 IP 之间有数据包发送,并且有回复到达,也就是说,我实际上数据包转储中的回复,其地址为 的 IPv6 地址br0。我尝试使用 指定每个接口,但ping6 -I <interface>没有成功。

所以现在我没有主意了:我发送了数据包,收到了正确地址的回复,但系统似乎仍然在丢弃它而不是接受它。为什么它会丢弃它们?这可以调试吗?

编辑:我确实有 IPv6 路由,运行ip -6 route结果为:

XXXX:XXX:XXXX:XXXX::/64 dev br0  proto kernel  metric 256  expires 6997sec
fe80::/64 dev br0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via fe80::XXX:XXXX:XXXX:XXXX dev br0  proto ra  metric 1024  expires 1597sec

第一行是我的路由器 (Fritz Box) 中报告的 ISP 分配的前缀,这似乎是正确的,因为这应该是我的本地网络(我说得对吗?),所以我不需要网关。其他两个是链路本地地址,所以没问题。

现在,最后一条路线应该很有趣,对吧?我在那里找到的 IP似乎匹配我的路由器。我可以 ping 它,但必须指定接口,即运行ping6 <ip>会产生:

connect: Invalid argument

ping6 -I br0 <ip>有效:

PING <ip>(<ip>) from <myip> br0: 56 data bytes
64 bytes from <ip> icmp_seq=1 ttl=64 time=0.534 ms
64 bytes from <ip> icmp_seq=2 ttl=64 time=0.393 ms
64 bytes from <ip> icmp_seq=3 ttl=64 time=0.350 ms
64 bytes from <ip> icmp_seq=4 ttl=64 time=0.369 ms
^C
--- <ip> ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.350/0.411/0.534/0.075 ms

当然<ip>是路由器的 IP,也就是fe80::...上面的地址。我无法在路由器配置中找到这个地址,但是,我确实找到了它的唯一本地地址 (ULA),它以 开头,fd80::但除此之外是相同的,所以我非常确信这是我的路由器的 IPv6 地址。

然而:我可以使用 which 查找我的路由器 IP,nslookup -query=AAAA fritz.box得到两个响应:ULA(fd00::...)和前缀()内 ISP 分配的 IPv6 地址,后缀相同(我猜它是通过使用 SLAAC 和 MAC 来选择的)。这里没有显示的是以which 开头的 IP 输入路由的2a02:...IP 。fe00:...

也许有人可以解释这种奇怪的行为......

答案1

我不能说我能追溯到问题的根源,但至少我找到了一个“破解”方法。我必须确保我的网桥确实从我的eth0接口获取了 MAC,而不是随机分配的tap0MAC。要确保这一点,您只需确保您的tap0地址大于eth0

/usr/bin/openvpn --mktun --dev tap0
ip link set dev tap0 down
ip link set dev tap0 address 5a:c0:02:9e:ae:3c
ip link set dev tap0 up

现在创建桥梁将选择eth0的 MAC,然后将正确配置为 SLAAC。我不太清楚得到为什么它能这样工作,但是现在甚至端口转发也能正常工作,一切似乎都正常。

现在路线似乎设置正确,并且我可以访问外部和内部系统。

答案2

您记得在 /etc/sysctl.conf 中启用 ipv6 转发吗?

改变线路

 #net.ipv6.conf.all.forwarding=1

 net.ipv6.conf.all.forwarding=1

但这会禁用无状态自动配置。

相关内容