我有一个已上线并可通过隧道 tun0 访问的网络。此 tun0 使用以下 Python 脚本启动:
tun_name = 'tun0'.encode()
ifs = ioctl(self.virtualIf, TUNSETIFF, struct.pack("16sH", tun_name, IFF_TUN))
self.ifname = tun_name.decode()
print('[NetworkSideThread] Created virtual interface '+self.ifname+'.')
# configure IPv6 addresses of virtual interface
subprocess.check_call(CMD_IFCONFIG + ' ' + self.ifname + ' up', shell=True)
subprocess.check_call(CMD_IFCONFIG + ' ' + self.ifname + ' inet6 add ' + self.prefix + '::1/64', shell=True)
subprocess.check_call(CMD_IFCONFIG + ' ' + self.ifname + ' inet6 add fe80::1/64', shell=True)
print('[NetworkSideThread] Configured IPv6 address')
# set static route
subprocess.check_call(CMD_ROUTE+' -A inet6 add ' + self.prefix + '::/64 dev ' + self.ifname, shell=True)
网络内的设备均有一个 bbbb:: 地址(例如,bbbb::17:d00:30:6fb6 和 bbbb::17:d00:30:76f6)。目的是让从 76f6 发送到 6fb6 的流量到达隧道,然后正确发送到 6fb6。
奇怪的是:采用上述配置,它只在某些时候起作用!
执行“route -A inet6”显示:
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2a02:2c40:500:a006::/64 [::] Ue 256 0 0 ens33
bbbb::/64 [::] U 1 3 290 tun0
bbbb::/64 [::] U 256 0 0 tun0
fe80::/64 [::] U 256 1 38 ens33
fe80::/64 [::] U 256 0 0 tun0
[::]/0 gateway UG 100 1 1 ens33
[::]/0 [::] !n -1 1 16599 lo
ip6-localhost/128 [::] Un 0 5882117 lo
2a02:2c40:500:a006::/128 [::] Un 0 4 3 lo
ubuntu/128 [::] Un 0 1 0 lo
ubuntu/128 [::] Un 0 3 82 lo
bbbb::/128 [::] Un 0 3 5 lo
ubuntu/128 [::] Un 0 4 57 lo
fe80::/128 [::] Un 0 3 6 lo
fe80::/128 [::] Un 0 1 0 lo
ubuntu/128 [::] Un 0 1 0 lo
ubuntu/128 [::] Un 0 1 0 lo
ubuntu/128 [::] Un 0 3 33 lo
ip6-mcastprefix/8 [::] U 256 4 610 ens33
ip6-mcastprefix/8 [::] U 256 0 0 tun0
[::]/0 [::] !n -1 1 16600 lo
我的猜测是,有时从 76f6 发送到 6fb6 的流量会采用“2a02:2c40:500:a006::/64 [::] Ue 256 0 0 ens33”路由,有时会采用“bbbb::/64 [::] U 1 3 290 tun0”路由。
在设备发送到 bbbb 地址的所有情况下,数据包都应通过隧道注入 bbbb 网络。
有没有什么办法可以解决这个问题?这很奇怪,因为它并不是一直发生的。
编辑:
请求的信息:
ip -6 路由获取 bbbb::17:d00:30:6fb6
给出
bbbb::17:d00:30:6fb6 来自 :: dev tun0 src bbbb::1 metric 1 pref medium
和
ip 路由显示匹配 bbbb::17:d00:30:6fb6
什么也没给出。
嗯,你的第一条评论很有道理,所以我最初的假设是错误的。为了补充信息,我在隧道上添加了 Wireshark 的屏幕截图,它显示了在 6fb6 收到数据包和未收到数据包的情况下数据包相同(数据包
这似乎表明我错了。那么无法立即知道问题是什么——接收设备在某些情况下可能会掉线,而在其他情况下则不会掉线,但这很奇怪。
Wireshark 也给出了相同的结果。前 3 个数据包是第一次传输并到达目的地,后 3 个数据包(虽然相同)是第二次传输,但未到达!