NAT

第一部分: NAT介绍

各种不同类型的NAT(according to RFC)

Full Cone NAT:

内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,任何外部主机只要知道这个(PublicIP:PublicPort)就可以发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

Restricted Cone NAT:

内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机IP发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,任何端口)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

Port Restricted Cone NAT:

内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机(IP,Port)发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,Port)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

Symmetric NAT:

内网主机建立一个UDP socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP-1,Port-1),以后内网主机发送给外部主机1的所有数据都是用这个(PublicIP-1,Port-1),如果内网主机同时用这个socket给外部主机2发送数据,第一次发送时,NAT会为其分配一个(PublicIP-2,Port-2), 以后内网主机发送给外部主机2的所有数据都是用这个(PublicIP-2,Port-2).如果NAT有多于一个公网IP,则PublicIP-1和PublicIP-2可能不同,如果NAT只有一个公网IP,则Port-1和Port-2肯定不同,也就是说一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。此外,如果任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现UDP-P2P通信。

第二部:NAT类型检测

前提条件:有一个公网的Server并且绑定了两个公网IP(IP-1,IP-2)。这个Server做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就不能P2P了(检测停止)。
当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的(LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。

第二步:检测客户端NAT是否是Full Cone NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。

第三步:检测客户端NAT是否是Symmetric NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

注:以上检测过程中只说明了可否进行UDP-P2P的打洞通信,具体怎么通信一般要借助于Rendezvous Server。另外对于Symmetric NAT不是说完全不能进行UDP-P2P达洞通信,可以进行端口预测打洞,不过不能保证成功

### NAT 网络地址转换原理 NAT(Network Address Translation,网络地址转换)是一种用于将私有网络中的专用IP地址转换为公共网络中合法全球唯一IP地址的技术。其主要目的是解决IPv4地址耗尽问题,并增强网络安全性和灵活性。 #### 原理概述 NAT的核心在于维护一张映射表,记录内部私有IP地址与外部公有IP地址之间的对应关系。根据不同的应用场景和技术需求,NAT分为静态NAT、动态NAT和端口多路复用(PAT)。 - **静态NAT**:一对一地将内部私有IP地址永久映射到一个固定的公有IP地址上[^5]。这种方式适合需要长期对外提供服务的设备,例如Web服务器或邮件服务器。 - **动态NAT**:允许多个内部私有IP地址临时映射到一组公有IP地址池中的某一个地址上[^1]。这种模式下,每次连接都会重新分配一个新的公有IP地址给请求者,直到该地址不再被使用为止。 - **端口多路复用(PAT)**:进一步扩展了动态NAT的功能,允许多个内部主机共享同一个公有IP地址并通过不同端口号区分流量[^5]。这是当前最常用的NAT形式之一,因为它能够显著减少所需的公有IP地址数量。 #### 工作机制 当配置了动态NAT的内部设备尝试访问外部网络时,路由器会自动从预定义好的公有IP地址池里选取未使用的地址来完成此次通信过程;如果所有可用地址都被占用,则新的连接请求会被拒绝[^2]。对于PAT而言,除了简单的IP地址替换外还会涉及TCP/UDP协议层面上的信息修改——具体来说就是调整源端口号以便后续返回的数据包能正确找到目标机器[^3]。 --- ### NAT 配置方法 以下是基于华为设备的一般性指导步骤: #### 创建地址池 首先需定义可用于转换操作的目标范围即所谓的“地址组”。命令如下所示: ```shell [Huawei] nat address-group group-index start-address end-address ``` 其中`group-index`代表自定编号用来标识这个特定集合;而`start-address`至`end-address`则明确了实际可供选用的具体数值区间[^4]。 #### 设置内外接口属性 接着明确指出哪一侧属于局域网部分(`inside`)以及广域网方向(`outside`)。例如: ```shell [Huawei]interface GigabitEthernet 0/0/1 [Huawei-GigabitEthernet0/0/1] ip address inside [Huawei]interface GigabitEthernet 0/0/2 [Huawei-GigabitEthernet0/0/2] ip address outside ``` #### 启动NAT规则 最后一步便是关联之前准备好的各项参数形成完整的策略描述语句。如果是执行标准型态下的简单互换动作可以直接写成这样子的形式即可满足大部分基础用途的要求: ```shell [Huawei] acl number 2000 [Huawei-acl-basic-2000] rule permit source private-network-subnet mask-length [Huawei] nat address-group group-index outbound interface-name ``` 这里需要注意的是ACL列表应当精确匹配希望参与变换流程的所有可能发起方所在位置段落信息[^4]。 而对于更复杂的场景比如涉及到PAT的情况,则需要用到稍微复杂一点的指令结构来进行处理: ```shell Router(config)#ip nat inside source list access-list-number pool name overload ``` 此条目里的关键字overload正是指示启用端口重叠特性从而达成最大化利用单一公网出口的目的[^3]。 --- ### 示例代码展示 下面给出一段综合性的脚本样例供参考学习之用: ```shell # 定义地址池 [Huawei] nat address-group 1 192.168.1.100 192.168.1.150 # 设定内网接口 [Huawei]interface GigabitEthernet 0/0/1 [Huawei-GigabitEthernet0/0/1] ip address 172.16.0.1 255.255.255.0 [Huawei-GigabitEthernet0/0/1] nat inside # 设定外网接口 [Huawei]interface GigabitEthernet 0/0/2 [Huawei-GigabitEthernet0/0/2] ip address 202.100.1.1 255.255.255.0 [Huawei-GigabitEthernet0/0/2] nat outside # 编辑访问控制列表 [Huawei] acl number 2000 [Huawei-acl-basic-2000] rule permit source 172.16.0.0 0.0.255.255 # 应用NAT规则 [Huawei] nat address-group 1 outbound GigabitEthernet 0/0/2 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值