我在一台使用桥接网络的主机上安装了一台虚拟机(因此,它有自己的 MAC 地址)。主机和虚拟机都运行 CentOS。它们的网络由包含静态 IP 地址的简单文件管理/etc/sysconfig/network-scripts/ifcfg-enpXsY
。IPv4 运行良好。
我已为虚拟机分配了一个 IPv6 地址(主机也有一个),该地址在数据中心内路由正确。但是,大多数连接都使用 IPv4(机器还没有 DNS AAAA 条目,仍在测试 IPv6)。
当我启动虚拟机时,它具有完整的 IPv6 连接。但是,一段时间后 IPv6 连接停止工作(IPv6 魔法?)。我已将问题缩小到邻居(ARP/NDISC 缓存)数据:
IPv6 不工作,无法 ping 或通过 IPv6 连接,然后我看到:
# ip -6 neighbour
fe80::1 dev enp1s2 lladdr 0c:86:72:2e:04:28 router STALE
修复/解决方法以刷新缓存:
# ip -6 neighbour flush dev enp1s2
# ip -6 neighbour
(empty, as expected)
然后ping6
主机从VM内部填充缓存:
# ping6 2912:1375:23:9a6c::2
PING 2912:1375:23:9a6c::2(2912:1375:23:9a6c::2) 56 data bytes
64 bytes from 2912:1375:23:9a6c::2: icmp_seq=1 ttl=64 time=2.35 ms
64 bytes from 2912:1375:23:9a6c::2: icmp_seq=2 ttl=64 time=0.468 ms
^C
# ip -6 neighbour
fe80::1 dev enp1s2 lladdr 0c:86:72:2e:04:28 router REACHABLE
2912:1375:23:9a6c::2 dev enp1s2 lladdr 08:21:4b:b7:f8:31 DELAY
IPv6 邻居/ARP 表恢复有效性并且连接正常!
我的问题是:
- 缓存为何会变得陈旧?
- 我该怎么做才能避免这种情况?'
- 为什么/如何上述命令可以修复它?
当然,我可以在cron
作业中运行这些命令(多久一次?)但我认为这对于 IPv6 的正常运行来说并不是必需的?
PS:我使用脚本进行测试:IPv6 堆栈大约每 20 分钟就会发生一次故障。这可以通过 RFC 来解释吗?
PPS:防火墙配置(缩短的输出,希望所有相关位):
# ip6tables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
9023 709K ACCEPT icmpv6 !lo * ::/0 ::/0
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
9360 785K ACCEPT icmpv6 * !lo ::/0 ::/0
因此,ICMPv6 在虚拟机上接受进/出。我需要检查主机上的过滤吗?
答案1
一般来说,陈旧状态是一件好事,实际上,我们有陈旧状态是可以接受的。
让我们看一下 RFC 4861,第 5.1 节:
STALE The neighbor is no longer known to be reachable but until traffic is sent to the neighbor, no attempt should be made to verify its reachability.
邻居不再被认为是可达的(计时器过期、最近没有流量等等),并且一旦再次向邻居发送流量,可达性就会得到“验证”。
因此,如果您可以再次向邻居发送流量,则没有任何问题。