关注CodingTechWork

引言

  在 IP 网络的世界里,IPv4 地址枯竭早已不是新闻,而 IPv6 的全面部署仍处于漫长的过渡期。为了让不同 IP 版本(IPv4/IPv6)以及不同地址类型(公网/私网)的网络能够相互通信,NAT(网络地址转换) 技术不断演化,形成了多种变体。

本文将围绕以下四种核心 NAT 技术展开:

  • NAT44:IPv4 私有地址 → IPv4 公有地址
  • NAT46:IPv4 → IPv6(让 IPv4 客户端访问 IPv6 服务端)
  • NAT64:IPv6 → IPv4(让 IPv6 客户端访问 IPv4 服务端)
  • NAT66:IPv6 → IPv6(IPv6 网络间的地址转换)

注意:NAT46 与 NAT64 的方向相反,切勿混淆。

介绍

IPv4 与 IPv6 的本质差异

特性IPv4IPv6
地址长度32 bit128 bit
地址数量~43 亿2^128
表示方式点分十进制 (192.168.1.1)十六进制冒号分隔 (2001:db8::1)
NAT 必要性极高(因地址短缺)理论上不需要,但实践中存在

私有地址范围(RFC 1918)

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

这些地址不能在公网路由,必须通过 NAT 转换。

特殊 IPv6 地址范围

  • 唯一本地地址 (ULA):fc00::/7(类似 IPv4 私网)
  • 链路本地地址:fe80::/10
  • IPv4 映射 IPv6 地址:::ffff:0:0/96(NAT46 常用)
  • NAT64 知名前缀:64:ff9b::/96(用于合成 AAAA 记录)

CIDR 与 192.168.1.0/24 网段详解

###核心概念

  • 网段:是IP地址空间的一段连续区间,用于在局域网(LAN)或虚拟网络中,对设备进行逻辑分组。
  • CIDR表示法:即“IP地址/前缀长度”,例如 192.168.1.0/24。其中 /24 表示子网掩码的前24位为1。
  • 子网掩码:与IP地址配合使用,用以区分网络位和主机位。对于 /24,其点分十进制形式的子网掩码为 255.255.255.0。

192.168.1.0/24 网段解析

属性值说明
IP地址范围192.168.1.0 —— 192.168.1.255完整地址空间。
网络地址192.168.1.0标识网络本身,不可分配给主机。
广播地址192.168.1.255用于向该网段所有主机发送消息,不可分配给主机。
可用IP地址192.168.1.1 —— 192.168.1.254共 254 个地址,可分配给路由器、电脑、打印机等设备。
网络位前 24 位 (即 192.168.1)所有同网段设备的网络部分必须相同。
主机位后 8 位 (即最后一个数字)用于区分同一网段内的不同设备。

应用与特性

  • 网络类型:192.168.1.0/24 属于 C类私有地址(定义于 RFC 1918)。
  • 路由范围:该地址段不能在公共互联网上直接路由,必须通过网络地址转换(NAT)技术才能访问公网。
  • 典型场景:非常适合用于家庭、小型办公室或实验室环境的局域网,可轻松容纳 254 台设备。

计算与扩展

  • 可用主机数公式:对于 /24 网段,主机位为 8 位,可用主机数 = ( 2^8 - 2 = 254 ) 个。减去的是网络地址和广播地址。
  • 划分子网:可以通过向主机位借位,将 /24 网段划分为更小的子网(例如 /25、/26 等),以适应不同规模的需求。

NAT44:IPv4 到 IPv4 的转换

原理

将内部私有 IPv4 地址转换为一个或多个公网 IPv4 地址,通常结合 端口复用 (PAT/NAPT),让成百上千个内网主机共享一个公网 IP。

流量图

NAT44

示例配置(iptables)

# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# SNAT:将内网192.168.1.0/24的源地址改为eth0的公网IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5

优缺点

  • 优点:成熟、高效、节省 IPv4 地址
  • 缺点:破坏端到端透明性;P2P/VoIP 穿透困难

NAT46:IPv4 客户端访问 IPv6 服务端

核心原理

NAT46 将 IPv4 数据包转换为 IPv6 数据包,使 仅支持 IPv4 的客户端 能够访问 仅支持 IPv6 的服务器。

它通常配合 DNS46 使用:DNS46 将 IPv6 服务器地址合成为 IPv4 地址(例如将 2001:db8::1 映射为 192.0.2.100),引导流量经过 NAT46 网关。

  • 转换方式:有状态(维护映射表)或无状态(前缀静态映射)
  • 典型前缀映射:将 IPv6 前缀映射到一段 IPv4 地址池

流量图

![NAT46](https://i-blog.csdnimg.cn/direct/3f88e6d791a84f85af84fdb0e7d05dc7.png)

应用场景

  • 过渡期兼容:让尚未升级的 IPv4 遗留系统访问新部署的 IPv6-only 服务
  • 内容提供商:老旧 IPv4 监控系统需要调用 IPv6 后端 API
  • 运营商/企业:部分内部工具只支持 IPv4,但后端已迁移至 IPv6

示例配置

# 加载 Jool 模块
modprobe jool

# 添加 NAT46 实例(方向:IPv4 → IPv6)
jool instance add "nat46" --netfilter --pool4 192.0.2.100/32

# 添加 IPv4 → IPv6 静态映射
jool -i nat46 static add 192.0.2.100 2001:db8::1

# 开启 IPv4 转发
sysctl -w net.ipv4.ip_forward=1

NAT64:IPv6 客户端访问 IPv4 服务端

核心原理

NAT64 允许 仅具有 IPv6 地址的客户端 访问 仅具有 IPv4 地址的服务器。它通常配合 DNS64 使用:DNS64 合成 AAAA 记录(将 IPv4 地址嵌入 IPv6 前缀中),引导流量经过 NAT64 网关。

  • 知名前缀:64:ff9b::/96(Well-Known Prefix)或自定义
  • 转换方式:有状态(维护映射表)或无状态

流量图(有状态 NAT64)

NAT64

示例配置

# 加载Jool内核模块
modprobe jool

# 添加NAT64实例
jool instance add "nat64" --netfilter --pool6 64:ff9b::/96

# 添加IPv4地址池(用于转换后的源地址)
jool -i nat64 pool4 add 203.0.113.100 203.0.113.200

# 开启IPv4转发
sysctl -w net.ipv4.ip_forward=1

应用场景

  • 移动运营商(纯 IPv6 手机访问 IPv4 互联网)
  • 企业 IPv6-only 数据中心访问外部 IPv4 服务
  • 云平台过渡期

NAT66:IPv6 到 IPv6 的转换

为什么需要 NAT66?

IPv6 的设计目标是不需要 NAT,但现实中仍有几种场景促使 NAT66 出现:

  1. 多宿主场景:内部网络使用 ULA (fd00::/8),对外使用公网 IPv6 前缀(当 ISP 变动时避免内部重编址)
  2. 网络合并:两个使用相同 IPv6 前缀的私有网络通过 VPN 连接时避免冲突
  3. 安全/策略需求:隐藏内部 IPv6 地址结构
  4. 传统思维惯性:部分管理员仍习惯 NAT 隔离

核心原理

与 NAT44 类似,将内部 IPv6 源地址转换为另一个 IPv6 地址(通常是前缀替换)。可以是有状态(维护映射表)或无状态(如 NPTv6 - 前缀静态映射)。

  • NPTv6 (RFC 6296):无状态前缀转换,1:1 映射,不改变端口号。

流量图(有状态 NAT66)

NAT66

示例配置(nftables)

# 使用 nftables 做 NPTv6 前缀转换
nft add table nat66
nft add chain nat66 postrouting { type nat hook postrouting priority 100\; }
nft add rule nat66 postrouting oifname "eth0" \
    snat ip6 to 2001:db8:1000::/48 map { fd01::/48 : 2001:db8:1000::/48 }

四种 NAT 对比总表

类型转换方向地址类型转换端口转换常见程度典型场景
NAT44IPv4 → IPv4私网 IPv4 → 公网 IPv4通常有极高家庭/企业普通上网
NAT46IPv4 → IPv6IPv4 → IPv6可有可无极低IPv4 客户端访问 IPv6 服务
NAT64IPv6 → IPv4IPv6 → IPv4有状态高IPv6-only 访问 IPv4 服务
NAT66IPv6 → IPv6IPv6 → IPv6可选低多宿主、内部前缀冲突解决

重点记忆:NAT46 是 IPv4 → IPv6;NAT64 是 IPv6 → IPv4,两者方向相反。

更多推荐