C 语言网络编程 — NAT 网关运行原理

本文详细介绍了NAT(网络地址转换)技术,包括NATGW实现原理、NAT的类型(静态NAT、动态NAT)、SNAT、DNAT和NAPT的功能。此外,还讨论了NAT的连接跟踪功能、NATServer和NAT穿透的应用,以及在Linuxiptables中的配置。
摘要由CSDN通过智能技术生成

目录
文章目录
目录
NAT
NAT GW 实现原理
NAT 技术的类型
NAT 技术的基本原理
NAT 技术的连接跟踪功能
NAPT 技术的基本原理
NAPT 技术的连接跟踪功能
NAT Server
NAT 穿透
Linux iptables NAT
SNAT
DNAT
NAPT
NAT
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 GW 实现原理
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
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 
1
在动态 NAT 场景中,还需要使用 IP 地址伪装模式(MASQUERADE),这是一种动态 SNAT 技术,通常用于家庭网络或移动网络。

$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
1


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
1


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
1
2
3
4

————————————————
版权声明:本文为CSDN博主「范桂飓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jmilk/article/details/131905708

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值