草稿说明:本文先搭好骨架与关键结论,方便以后按坑补截图、配置片段和命令输出。文中标了
TODO的地方,都是准备回头填实的。
写这篇的原因
最近为了一台只有 IPv6(AAAA、无 A 记录)的机器做 SSH,踩了不少坑:手机蜂窝 / 同一 Wi‑Fi 都能连,本机却一直超时。排查过程中,不只是「把网络弄通」,还顺手在路由器上搭了虚拟网桥、理清了区域防火墙,并把 DHCPv6-PD、RA 通告里的标志位、邻居发现失败、隐私地址这些概念串了起来。
这篇按「现象 → 概念 → 配置要点 → 排查命令」来写,方便以后自己查,也方便有类似场景的人对照。
适用读者
- 配过家用 / 软路由,知道 WAN、LAN、DHCP 大概是什么
- 听说过 IPv6,但不一定分得清 SLAAC、DHCPv6、PD、RA
- 不要求背 RFC,但愿意对着路由器面板或命令行改几项
故事线(总览)
%%{init: {'theme':'dark'}}%%
flowchart TD
A["现象: 手机能 SSH<br/>本机超时"] --> B["域名只有 AAAA"]
B --> C["本机多段 IPv6 前缀"]
C --> D["默认源地址落在废前缀"]
D --> E["开关 Wi-Fi / 绑源地址后恢复"]
E --> F["顺带整理路由器侧"]
F --> G["DHCPv6-PD + 子网 ID"]
F --> H["RA: A/M/O + PIO"]
F --> I["虚拟网桥"]
F --> J["防火墙区域规则"]
F --> K["网线导致 ND FAILED"]
F --> L["隐私扩展: 稳定/临时地址"]
1. 现象:同一 Wi‑Fi,手机通、电脑不通
1.1 表面线索
- 域名解析只有 AAAA,没有 A → 客户端必须走 IPv6
- 手机(公司 Wi‑Fi / 流量)SSH 正常
- 本机(同一公司 Wi‑Fi)连接超时
1.2 真正原因(本机侧)
本机网卡上同时挂着多段全局前缀(例如旧的 …:87b0: / …:4a50: 和新的 …:6900:)。出站时系统按地址选择规则挑了仍挂在网卡上、但实际上已经路由不通的源地址,于是 SYN 一直发不出去;绑到仍可达的前缀后,TCP 立刻通。
开关一次 Wi‑Fi 后,旧前缀被清掉,只剩当前 RA 下发的前缀,问题消失。
TODO:补上当时
ifconfig/ndp -p/ 绑源地址前后的对照输出(可打码)。
1.3 和「Mac 坏了」的关系
不完全是系统 bug。IPv6 主机按 RA 的 valid lifetime 保留前缀地址;网关若把 vltime 设成几天(例如 259200 秒 ≈ 3 天),旧前缀会残留到过期或链路重置。
RA 的 lifetime ≠ 运营商换 PD 的周期——前者是局域网通告给终端的「还能用多久」,后者是上行前缀租约/重拨策略。
2. 路由器上为什么要虚拟网桥
TODO:画一张你实际的拓扑(WAN / 桥 / LAN / Wi‑Fi / 管理口),并写清当时要解决的具体目标(例如:把某几个口合成一个 L2 域、隔离访客、给下游再划 PD 子网等)。
2.1 桥在解决什么问题
虚拟网桥(bridge)把多个二层口绑成同一个广播域:同一网段、同一套 RA/ND,主机之间可以靠邻居发现直达。没有桥、却期望「插在不同物理口上的设备像在同一 LAN」,往往会出现:
- 有的口拿得到 RA,有的拿不到
- 防火墙按「接口 / 区域」拆开后,区域策略和你以为的拓扑不一致
2.2 配置时容易忽略的点
- 桥成员口一般不要再单独跑 IP / DHCP(地址打在 bridge 接口上)
- MTU、混杂模式、硬件 offload 有时会影响 ND / 组播
- 桥建好后,防火墙区域应挂在 bridge(或 bridge 所在 zone),而不是落单的物理口
TODO:贴路由器(或 OpenWrt / RouterOS / 某发行版)上创建 bridge 的具体步骤与截图。
3. 坑一:DHCPv6-PD 与子网划分标识
3.1 PD 在做什么
运营商(或上游)通过 DHCPv6 Prefix Delegation 分给你一段前缀(常见 /56、/60 等)。路由器再把这段前缀切成多个 /64,分给不同 LAN / VLAN / 下游接口。
上游 PD 例如: 240e:xxxx:yyyy:zz00::/56
├─ ::00/64 → LAN1
├─ ::01/64 → LAN2
└─ ::02/64 → 访客 / IoT ...
3.2 「划分子网时的标识」指什么
不同面板叫法不一,常见相关概念:
| 概念 | 含义 |
|---|---|
| PD 前缀 | 上游分下来的整段 |
| Subnet ID / 子网索引 | 从 PD 里取出哪一个 /64(前缀中可变的那几位) |
| 接口 ID | /64 之后主机自己的 64 bit(SLAAC 或手工) |
| IA_PD / IAID | DHCPv6 里标识「我要哪一条 PD 租约」 |
配错 Subnet ID 的典型症状:接口上有地址,但和上游路由对不上;或两个接口撞了同一个 /64。
TODO:写清你用的路由器菜单路径、当时 PD 长度、各 LAN 的 Subnet ID 取值,以及一次配错时的现象。
3.3 和 RA lifetime 的关系(再强调一次)
PD 租约续约、光猫重拨,都可能导致新前缀出现;若路由器仍用较长的 RA vltime 通告、或终端未重建链路,局域网主机会短暂(甚至数天)保留旧 /64 上的地址——这就是本机「多前缀残留」的网络侧背景。
4. RA 通告:A / M / O 与 PIO
路由器周期性发 Router Advertisement(ICMPv6 type 134)。终端靠它学到:默认路由、前缀、要不要自己配地址、要不要去问 DHCPv6。
4.1 报文级标志(Router 头里)
| 标志 | 全称(常见叫法) | 置位后终端倾向 |
|---|---|---|
| M | Managed | 用 DHCPv6 拿地址(托管地址配置) |
| O | Other Config | 地址可 SLAAC,但「其他信息」(DNS 等)走 DHCPv6 |
| A | 见下(在 PIO 里) | 是否允许对该前缀做 SLAAC |
实务里常见组合:
- 只要 SLAAC:M=0,O=0 或 1(要 DNS 时 O=1),PIO 里 A=1
- 纯 DHCPv6 地址:M=1,PIO 里 A=0(看实现)
- SLAAC + DHCPv6 DNS:M=0,O=1,A=1
TODO:贴你路由器 RA 页面截图,并写最终选定的 M/O/A 组合及原因。
4.2 PIO(Prefix Information Option)
PIO 是 RA 里描述「有哪些前缀」的选项,关键字段包括:
- 前缀与前缀长度(LAN 上几乎总是
/64) - L(on-link):该前缀是否视为链路本地直达
- A(autonomous):是否允许主机用此前缀做 SLAAC
- preferred lifetime / valid lifetime:优先使用多久、地址保留多久
本机用 ndp -p 看到的 pltime / vltime,就是从 PIO 学来的。
4.3 本机怎么听 RA(备忘)
# 已学到的前缀(无需 root)
ndp -p
ndp -r
# 抓原始 RA(需要权限;ICMP6 type 134)
sudo tcpdump -i en0 -n -vv 'icmp6 && ip6[40] == 134'
TODO:补一段真实 tcpdump 输出,标出 M/O 与 PIO 的 A/L、lifetime。
5. 防火墙:区域之间谁可以到谁
软路由 / 防火墙发行版里,常见模型是:接口划入区域(zone),再写区域间转发策略。
5.1 为什么 IPv6 特别容易「配了地址却不通」
IPv6 大量依赖链路本地与 ICMPv6(RS/RA、NS/NA、PTB 等)。若区域策略只放行了「TCP 22」,却拦了:
- 出站 / 入站 ICMPv6
- 到
ff02::1/ff02::2的组播 - 跨 zone 的 forwarded 流量
就会出现「地址看起来有了,邻居建不成 / SSH 建不成」。
5.2 配置时建议先想清的矩阵
| 源区域 → 目的区域 | 是否允许 | 备注 |
|---|---|---|
| LAN → WAN | 是 / 否 | 出站上网 |
| WAN → LAN | 通常否(或仅端口转发) | 入站 |
| LAN → 管理 | ? | 是否允许访问路由器 UI |
| 访客 → LAN | 通常否 | 隔离 |
| 同桥成员 | 二层直达 | 可能不经三层防火墙 |
TODO:按你实际 zone 名称填表,并贴关键规则(firewalld / nft / 面板策略均可)。
5.3 和网桥的交叉点
桥接口属于哪个 zone,决定「整桥」的默认信任级别。物理口移入桥之后,旧的「按物理口划分的区域规则」可能失效或变成幽灵配置——这是改拓扑后必查的一项。
6. 坑二:网线与 IPv6 邻居状态 FAILED
6.1 现象
路由器上某邻居的 IPv6 Neighbor 状态为 FAILED:链路层不可达。表现可能是:
- ping6 不通,但 IPv4 偶尔还「看起来正常」(或同样不稳)
- RA/NS/NA 交互失败,地址配置半残
6.2 为什么会怪到网线
邻居发现(ND)依赖二层可达:组播要能到、单播 NS/NA 要有应答。线材/水晶头/口协商异常时,IPv4 有时靠广播/ARP「凑合」出一点连通假象,IPv6 的 ND 却更早暴露为 FAILED。
TODO:写清当时换线前后的对比(速率协商、错误计数、
ip -6 neigh/ 路由器邻居表)。
6.3 排查备忘
# Linux 示例
ip -6 neigh show
# macOS 示例
ndp -an
关注:FAILED / INCOMPLETE 是否集中在某一物理口、某一 MAC。
7. IPv6 隐私扩展:为什么至少会看到两类地址
在启用隐私扩展(Privacy Extensions / Temporary Addresses)的系统上,同一 /64 里常见:
| 类型 | 作用 | 典型特征 |
|---|---|---|
| 稳定地址(secured / stable) | 相对固定,适合作为入站、长期标识 | 不频繁变 |
| 临时地址(temporary) | 默认用于对外发起连接,降低追踪 | 会轮换;过期后变 deprecated |
设计动机:若 SLAAC 地址里长期带着固定的接口标识,对外访问容易被跨站关联。临时地址把「对外源地址」和「对内可拨入的稳定地址」拆开。
对排查的影响:
- 看
ifconfig/ip addr时不要默认「多地址 = 配错了」 - 出站连不上时,除了前缀对不对,还要看当前选用的源地址属于哪一段前缀、是否已 deprecated
TODO:补 macOS / Linux 上如何区分 stable / temporary,以及如何临时关闭隐私扩展做对照实验(若你做过)。
8. 排查清单(以后可直接抄)
- 域名是否只有 AAAA?本机 IPv4 回退是否根本不存在?
ndp -p/ 路由通告:当前到底有几个/64?vltime多长?- 本机全局地址是否混有旧前缀?绑源地址或重建链路后是否立刻恢复?
- 路由器 PD、Subnet ID、各接口
/64是否一致且不重叠? - RA 的 M/O 与 PIO 的 A/L 是否符合你想要的「SLAAC / DHCPv6」模型?
- 防火墙 zone:ICMPv6、转发、桥接口所属区域是否合理?
- 邻居表是否 FAILED?换线 / 换口后是否改善?
- 是否误伤于代理 / TUN(本机若开了 Clash 等,另案排查)?
9. 参考与延伸
TODO:补上你实际读过的文档链接(路由器手册、RFC 4861/4862/4941/8415、发行版 wiki 等)。
可先占位:
- RFC 4861 — Neighbor Discovery
- RFC 4862 — IPv6 Stateless Address Autoconfiguration
- RFC 4941 — Privacy Extensions
- RFC 8415 — DHCPv6
附录:留给自己的补充清单
- 拓扑图与网桥配置步骤
- DHCPv6-PD / Subnet ID 实机截图
- RA 面板与 tcpdump 对照
- 防火墙区域矩阵与关键规则
- 网线故障时的邻居表证据
- 隐私地址对照实验
- 本机多前缀残留的完整命令日志