地址映射形式是什么
双栈主机在同一个套接字上同时接受两种协议的连接时,内部需要一个统一的表示方式:把四层地址写成六层地址的特定前缀形式。这个前缀占据高位九十六位,低三十二位保存原来的四层地址。它只是程序内部的表示,不应出现在网络报文里。
兼容形式为什么被废弃
早期还有另一种把四层地址直接嵌在低位的形式,本意是用于自动隧道。实际部署中发现它与真实六层地址难以区分,容易造成误解与错误路由,标准后来明确将其废弃。今天写文档或配置时不应再使用那种写法。
基本信息
| 映射前缀 | 高位九十六位为固定形式,低三十二位保存原地址 |
|---|---|
| 映射范围规模 | 低三十二位可表示全部四层地址 |
| 可否路由 | 不可,仅用于主机内部表示 |
| 兼容形式 | 标准已废弃,不应再使用 |
| 地址库表现 | 映射地址被判定为非全局,需还原后再判断 |
典型使用场景
- 读日志:服务日志里出现带前缀的四层地址,说明流量来自四层连接,还原后才是真实来源
- 排查双栈监听:监听在通配地址上时,两种协议的连接会落到同一个端口,需要知道如何区分
- 写访问控制:遇到映射形式先还原成四层地址再匹配规则,直接匹配前缀往往不生效
- 协议栈行为分析:理解主机为何只需一个通配监听就能同时服务两种协议
- 代码解析:解析日志与地址字段时调用地址库的还原方法,而不是手工截取字符串
- 文档规范:写方案时明确区分内部表示形式与真实地址,避免读者误配
两种形态
两种形态
映射形式:高位前缀 + 四层地址,仅主机内部使用,不可路由
兼容形式:四层地址直接嵌在低位,标准已废弃,不要再用
# 看到带前缀的地址,先还原出四层地址再判断来源与策略观察与还原
观察与还原
ss -lntp | grep ':::' # 通配监听,两种协议连接共用
python -c "import ipaddress as ip; a=ip.ip_address('::ffff:192.0.2.1'); print(a.ipv4_mapped, a.is_global)"
# 输出 192.0.2.1 False 还原后为四层地址,且被判定为非全局
python -c "import ipaddress as ip; print(ip.ip_address('::192.0.2.1').ipv4_mapped)"
# 输出 None,说明该写法不是映射形式(已废弃的兼容写法)两种写法对照
| 写法 | 名称 | 现状 | 用途 |
|---|---|---|---|
| 前缀加四层地址 | 映射形式 | 现行使用 | 双栈程序内部表示 |
| 低位直接嵌入 | 兼容形式 | 已废弃 | 历史自动隧道方案 |
| 解析结果 | 还原后为四层地址 | 地址库可识别 | 日志与规则处理 |
| 可否路由 | 均不可 | — | 不得出现在链路上 |
地址库会把映射形式判定为非全局地址,因此不要把它直接投入访问控制或地址清单匹配,先还原成四层地址再按原有规则判断才是正确做法。
这种前缀形式的地址不应出现在链路上:如果抓到它的报文,说明存在实现缺陷或人为构造的异常流量,需要结合来源与设备版本一起分析。