文章目录
NAT(Network Address Translation,网络地址转换)是一种 L3 网络层的 IP 地址转换技术,由 IETF 定义标准,最初用于缓解 IPv4 公网地址紧缺的问题。现在广泛被应用于公网 IP(全球唯一可寻址 IP 地址)和私网 IP(10、172、192 网段)之间的转换。
除了解决公网 IP 地址紧缺的问题之外,NAT 技术还常用于支撑以下网络功能:
- 数据安全伪装:可以将私网 IP 地址信息统一转换为公网 IP 地址,不让私网主机直接暴露在公网上,以此来提供网络安全性。
- 负载均衡:通过修改 srcIP、dstIP、dstPort 将数据包转发到后端 Real Server 进行处理。详细参考 LVS-NAT 技术实现。
- 透明代理:将 HTTP request 重定向到指定的 HTTP 代理服务器。
- 等等。
NAT 技术的类型
NAT GW 的基本原理是在转发 IP 数据包时,对其 srcIP/dstIP 甚至是 srcPort/dstPort 进行编辑和转换。
从 IP 映射关系上,可以细分为:
- 静态 NAT 技术(Static NAT):手动建立和维护一张静态地址映射表,公网 IP 和私网 IP 一一映射。由于无法有效解决公网 IP 紧缺的问题,所以基本不会使用。
- 动态 NAT 技术(Pooled NAT):自动建立和维护一张动态的地址映射表,公网 IP 和私网 IP 是一对多的关系。它具有一个公网 IP Pool,私网 IP 从这个 Pool 中动态获得公网 IP 地址,并与外部建立连接。而当连接断开后就会释放其占用的公网 IP 给其他私网 IP 使用。这个过程是动态完成的。
从 IP 编辑和转换类型上,可以细分为:
- SNAT 技术:修改 srcIP 的 NAT,解决私网 IP 访问公网的问题。
- DNAT 技术:修改 dstIP 的 NAT,解决公网 IP 访问私网的问题。
- NAPT 技术(Port-Level NAT):修改 dstPort 的 NAT,解决一个公网 IP 要映射到多个私网 IP 的问题。
NAT 技术的基本原理
如上图所示,NAT GW 具有对外和对内的 2 类网络端口:
- 公网 IP:202.20.65.5
- 私网网段:192.168.1.0/24,同时它还作为私网的 NAT GW 具有 192.168.1.1 IP 地址。
如果此时 NAT GW 已经配置了私网网段和公网 IP 地址之间的动态 NAT 规则,那么当私网中的 ClientA 192.168.1.2 向公网中 Web Server 202.20.65.4 发送了 1 个 IP Packet(srcIP=192.168.1.2、dstIP=202.20.65.4)时会执行以下 NAT 行为。
- 发包时 SNAT:NAT GW 会把 IP Packet 的 srcIP 转换为公网 IP,并发送到 Web Server。
- 收包时 DNAT:NAT GW 会把 IP Packet 的 dstIP 转换为私网 IP,并发送到 ClientA。
NAT 技术的连接跟踪功能
动态 NAT 技术需要依赖 Connection Track(连接跟踪)功能来维护动态的地址映射表,它使得 “回程包“ 知道应该转发给哪个私网 IP 地址。如下图所示:
NAPT 技术的基本原理
NAPT(Network Address Port Translation)用于实现将一个公网 IP 地址映射到多个私网 IP 上。如下图所示。
NAPT 技术的连接跟踪功能
NAT GW 的 Connection Track 还用于支持 NAPT 技术,
NAT Server
NAT Server,顾名思义是一台服务器角色,可以主动接受公网 Client 的请求,并转发到后端私网 IP 地址。实现的原理和上述一致,区别在于由于应用场景的不同,所以 NAT Table Entries 的创建时机不同。
- NAT GW:在 Egress 流量经过时创建 Entry。
- NAT Server:在 Ingress 流量进入前创建 Enty。
NAT 穿透
NAT 穿透是一种特殊的应用场景,顾名思义就是 “绕过 NAT GW“,实现两个网络间的 P2P(点到点)直接通信。NAT 穿透在多种场景中有用,例如:
- 网络游戏:通过使用 NAT 穿透技术,玩家可以直接建立 P2P 连接,实现低延迟的游戏体验,而无需借助中间服务器进行数据转发。
- 文件共享:通过使用 NAT 穿透技术,用户可以直接建立文件传输的连接,方便快速地共享文件。
- 实时通信应用:如视频会议、语音通话和实时聊天等,通常需要快速、稳定的连接以实现实时的数据传输。通过使用 NAT 穿透技术,参与通信的用户可以直接建立点对点连接,提供更好的通信质量和用户体验。
- 远程访问:在远程访问场景中,用户需要从外部网络访问位于内部网络的设备或资源。通过使用 NAT 穿透技术,用户可以直接访问内部网络中的设备,如远程桌面、网络摄像头或家庭自动化设备等,而无需依赖复杂的端口映射或 VPN 设置。
- IoT 设备通信:物联网(IoT)设备的快速发展导致了大量的设备连接到网络中,这些设备可能位于不同的 NAT 网络中。通过使用 NAT 穿透技术,可以帮助这些设备直接进行通信,实现设备之间的数据交换和互操作性,为物联网应用提供更多的灵活性和可扩展性。
Linux iptables NAT 转发操作需要在 filter 表中 FORWARD 链中允许,并且打开 Kernel ip_forwarding 转发功能。
另外,由于 iptables 会主动维护 NAT Table,所以在使用 iptables 配置时往往只需要配置 SNAT 或 DNAT 即可 “回包“,而无需为一个数据流同时创建 2 条规则。同时,Linux iptables 在 Kernel 中会将 Netfilter 和 ConnTrack 组合支撑会话跟踪功能。
SNAT
SNAT 作用于 Egress 流量,所以在 iptables 的 POSTROUTING 链生效。出站路径为:APP => TCP/IP stack 路由子系统 => filter:OUTPUT => nat:POSTROUTING => 出站。
$ iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 198.51.100.3
在动态 NAT 场景中,还需要使用 IP 地址伪装模式(MASQUERADE),这是一种动态 SNAT 技术,通常用于家庭网络或移动网络。
$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
DNAT
DNAT 作用于 Ingress 流量,所以在 PREROUTING 链中生效。
$ iptables -t nat -I PREROUTING -p tcp -d 198.51.100.3 --dport 80 -j DNAT --to 192.168.0.2
NAPT
NAPT 通常和 DNAT 一起使用,例如:将本机公网 IP 的 2222 端口映射到虚拟机内网 IP 的 22 端口。
$ iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22# 测试。$ ssh root@210.14.67.127 -p 2222