### [VPS IPv6邻居发现失败怎么办?从地址、默认路由到ND防火墙逐层排查](https://www.jiyueip.com/article/13374) **Published:** 2026-07-30T05:05:41 **Author:** 斑斓助理 **Excerpt:** VPS启用IPv6后出现能看到地址却无法联网、ip -6 neigh长期为FAILED或邻居表为空,通常与前缀分配、默认路由、RA/ND报文、云平台二层限制或防火墙有关。本文按地址、路由、邻居表和抓包顺序排查。 VPS 的 IPv6 地址已经配置,但访问外网超时、邻居表显示 `FAILED` 或始终为空时,问题不一定在 DNS。IPv6 不使用 ARP,而是依赖 ICMPv6 的邻居发现(ND)和路由器通告(RA)。应先确认地址和默认路由,再检查邻居状态、ICMPv6 过滤和云平台的 IPv6 接入方式;不要一上来反复重启网络服务。 ## 先确认地址、接口和默认路由 把命令中的 `eth0` 换成实际接口。全局地址应带有 `scope global`,链路本地地址通常是 `fe80::/10`,它本身不能代替公网前缀。 ``` ip -6 addr show dev eth0 ip -6 route show ip -6 route get 2001:4860:4860::8888 ``` 重点看三项:地址是否处于 `tentative` 或 `dadfailed`,路由表是否有 `default via ... dev eth0`,以及 `route get` 是否选中了预期接口。只有地址没有默认路由时,邻居发现即使正常也无法把流量送出。 ## 读取邻居表,区分状态含义 ``` ip -6 neigh show dev eth0 ip -6 neigh flush dev eth0 ping -6 -c 3 -I eth0 2001:db8::1 ``` - **REACHABLE、STALE:**内核已学到邻居链路层信息,STALE 不代表故障,实际发送时会重新确认。 - **INCOMPLETE、FAILED:**邻居解析没有收到有效的邻居通告,常见原因是网关地址、接口、VLAN 或 ICMPv6 被拦截。 - **表完全为空:**可能尚未产生需要解析的下一跳,也可能默认路由没有下一跳、上游使用静态路由而不响应预期的 ND。 清空邻居表只适合做一次验证,不能当成长期修复。清空后重新访问下一跳,观察状态是否从 INCOMPLETE 变为 REACHABLE 或 STALE。 ## 检查 RA、ND 与 ICMPv6 防火墙规则 IPv6 邻居发现依赖 ICMPv6 多种报文,不能用“只允许 ping”代替完整规则。至少核对安全组、VPS 控制台防火墙和系统防火墙是否允许必要的邻居请求、邻居通告、路由器请求和路由器通告。Linux 上先查看规则命中情况: ``` nft list ruleset ip6tables -L -n -v sysctl net.ipv6.conf.all.accept_ra sysctl net.ipv6.conf.eth0.accept_ra ``` 作为客户端的 VPS 通常需要接收 RA;但启用转发或使用特定路由方案时,内核对 RA 的处理又可能不同。不要直接把 `accept_ra` 改成某个值就结束排查,应结合系统角色、云平台文档和现有网络管理工具确认。修改前保存原值,避免远程操作把自己锁在服务器外。 ## 用抓包确认报文是否到达 当地址和路由看起来正确,抓包比猜测更快。选择实际接口,短时间运行后立即停止: ``` tcpdump -ni eth0 'icmp6 and (ip6[40] == 133 or ip6[40] == 134 or ip6[40] == 135 or ip6[40] == 136)' ``` 类型 133/134 分别是路由器请求和通告,135/136 是邻居请求和通告。只看到请求、看不到对应通告,说明上游没有回应或回包在安全组/系统防火墙处被丢弃;如果报文双向都有而邻居仍失败,则继续检查地址前缀、网关格式、重复地址检测和网络管理服务是否互相覆盖配置。 ## 确认云平台的 IPv6 交付模型 不同 VPS 的 IPv6 可能是自动 RA、静态网关、路由前缀或虚拟网络接口分配。常见误区包括:把控制台显示的网关当成同一网段地址、把完整前缀误配置成主机地址、在不支持二层多播的网络中期待传统 ND,或同时运行 cloud-init、NetworkManager 和手写脚本导致配置被覆盖。 应以服务商当前控制台信息为准,记录分配的前缀、主机地址、网关形式、接口名和重启后的持久化方式。若平台明确要求静态默认路由,就按其示例配置;若平台要求 RA,则不要用手写网关替换自动发现。无法确认交付模型时,先向服务商索取 IPv6 接入方式和允许的 ICMPv6 范围,而不是盲目关闭防火墙。 ## 修改后的验证顺序 1. 重新读取 `ip -6 addr` 和 `ip -6 route`,确认地址不再是 `tentative`,默认路由指向正确接口。 2. 清理一次邻居表,访问明确的下一跳或 IPv6 测试地址,观察 `ip -6 neigh` 状态。 3. 先用 IPv6 字面地址测试,再测试 DNS;这样能把解析问题与 ND 问题分开。 4. 分别验证重启前后配置,确认网络管理服务没有覆盖手工修改。 5. 恢复最小必要的 ICMPv6 放行规则,并记录变更时间和回滚值。 ## 常见问题 **VPS 有 IPv6 地址,为什么邻居表还是 FAILED?** 地址存在不代表下一跳可达。优先检查默认路由、网关形式、ICMPv6 规则和平台是否支持所需的 ND 方式。 **可以直接关闭 IPv6 防火墙测试吗?** 不建议长期关闭。若必须做短时隔离测试,应限定维护窗口、保存原规则并从控制台准备回滚路径,确认问题后恢复最小放行范围。 **只允许 ICMPv6 Echo 就够了吗?** 不够。邻居发现和路由器发现使用其他 ICMPv6 类型,单独放行 Echo 仍可能导致地址可见但下一跳解析失败。 **重启后 IPv6 又失效怎么办?** 检查 cloud-init、NetworkManager、systemd-networkd 及发行版网络配置的实际生效来源,保留一份持久化配置并避免多个组件同时管理同一接口。 **Tags:** IPv6网络, Linux服务器, VPS, 云服务器, 网络故障排查 **Categories:** 行业洞察 ---