网络安全 | 学习NAT44、NAT46、NAT64 与 NAT66原理

关注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 的本质差异

特性 IPv4 IPv6
地址长度 32 bit 128 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。

流量图

示例配置(iptables)

bash 复制代码
# 开启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

应用场景

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

示例配置

bash 复制代码
# 加载 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)

示例配置

bash 复制代码
# 加载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)

示例配置(nftables)

bash 复制代码
# 使用 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 对比总表

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

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

相关推荐
艾莉丝努力练剑2 小时前
【Linux网络】计算机网络入门:从背景到协议,理解网络通信基础
linux·运维·服务器·c++·学习·计算机网络
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(十):线程安全和重入、死锁相关话题
java·linux·运维·服务器·c++·学习·安全
23471021272 小时前
4.21 学习笔记
软件测试·笔记·python·学习
Keep Running *2 小时前
Python基础_学习笔记
笔记·python·学习
niucloud-admin2 小时前
PHP SAAS 框架常见问题——升级提示 mkdir(): Permission denied
php
AOwhisky2 小时前
Kubernetes 学习笔记:Volume 存储卷与 ConfigMap 配置管理
linux·运维·笔记·学习·云原生·kubernetes
梦梦代码精2 小时前
LikeShop 深度测评:开源电商的务实之选
java·前端·数据库·后端·云原生·小程序·php
周末也要写八哥2 小时前
前端三大类设计模式学习
学习·设计模式
特长腿特长2 小时前
在debian系统上使用kvm、添加网卡设备案例
服务器·debian·php