我有一个带有两个网络接口的设置:eth0
和tap0
,通过br0
bridge name bridge id STP enabled interfaces
br0 8000.************ no eth0
tap0
除了的本地 IPv6 地址之外,和eth0
都tap0
没有其他 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 将选择eth0
MAC 作为 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,而不是随机分配的tap0
MAC。要确保这一点,您只需确保您的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
但这会禁用无状态自动配置。