只要机房把你的 /64 网段配置成了“直连/同链路(On-link)”,你就绝对无法在纯网络层(Layer 3)彻底摆脱对机房路由器 NDP 行为的依赖。
为什么?因为 ndppd (NDP Proxy) 的核心工作原理是被动代答。它就像一个坐在宿主机网关的接线员,只有当机房路由器主动打电话来问(发送 NS 包):“请问 ::300 的 MAC 地址是多少?”,ndppd 才能接起电话回答。如果机房路由器装死,根本不打电话,或者它的交换机写死了 MAC 白名单,ndppd 的本事再大也无济于事,因为包根本就不会送到宿主机的网卡上。
但作为工程师,我们绝不能把业务的稳定性挂在服务商糟糕的路由器配置上。要彻底把命运掌握在自己手里,不看机房脸色,你有以下三条成熟的架构降维打击方案:
方案一:向机房索要“静态路由 (Static Route)”(真正的纯净 L3 转发)
这是最完美、最正统的解法。
现在的困境是,机房认为 /64 里的所有 IP 都和你宿主机的公网口 vmbr0 接在同一个大交换机上(Layer 2 寻址)。
你需要发一个工单,让机房改变路由方式:
“请将我的/64网段直接路由(Route)到我宿主机的主 IPv6 地址(比如::1)上。”
效果:
机房路由器再也不会去问 ::300 的 MAC 地址了!只要目标是这个 /64 里的 IP,机房路由器会连问都不问,直接把包裹一股脑全部砸给宿主机的 MAC 地址。
一旦机房这么做了,**你可以直接卸载 ndppd,关掉 proxy_ndp**,你的宿主机将变成一台真正的纯三层核心路由器。这是大厂机房(如 Hetzner)的标配做法。
方案二:应用层降维打击(反向代理架构)—— 部署 2FAuth 的首选
既然机房的路由器对宿主机的主 IPv6 地址(::1)是百分之百信任且绝对不会断流的(因为那是宿主机物理网卡原生绑定的),那我们就只用这个主 IP 对外见人。
不需要折腾底层的代理宣告了,直接在宿主机上部署 Nginx 或 Caddy 作为反向代理(Reverse Proxy)。
- 你的 KVM (
::300) 和 LXC (::102) 内部跑着业务(比如 2FAuth 的 8000 端口)。 - 在宿主机上,让 Nginx 监听公网主 IP
::1的 80 及 443 端口。 - 当外部流量访问你的域名时,全部打到宿主机的
::1上。Nginx 收到请求后,通过你已经打通的内网vmbr1桥接,把流量转发给::300:8000。
效果:
外部世界和机房路由器根本不知道 ::300 的存在。机房只看到你的宿主机 ::1 在疯狂收发流量。你完美绕过了所有 NDP 限制、MAC 限制和缓存老化问题。这不仅解决了网络断流,还顺便在宿主机层面集中管理了 SSL 证书和安全防护。
方案三:网络层退让(IPv6 NAT/SNAT 出海)
如果你不需要外部主动访问 KVM(比如只是在里面跑个爬虫、做个只出不进的服务),你可以直接把 KVM 伪装成宿主机。
在宿主机上加上极其简单的一条 ip6tables 规则:
ip6tables -t nat -A POSTROUTING -s 2602:1000:f::/64 -o vmbr0 -j MASQUERADE
效果:
KVM 发出的所有流量,在离开宿主机公网口的那一瞬间,源 IP 全部被改写成了宿主机的主 IP。机房路由器依然只认识宿主机,完美放行。回包时,宿主机内核会自动把 IP 翻译回 ::300 并送进内网。这彻底消灭了需要机房配合的问题。