NAT的四种分类:全锥形NAT,地址受限锥形NAT,端口受限锥形NAT,对称NAT

本文详细介绍了四种类型的NAT:全锥形NAT、地址受限锥形NAT、端口受限锥形NAT和对称NAT。全锥形NAT允许任意公网主机与内网主机通信,而地址受限和端口受限NAT在通信上有特定限制。对称NAT则根据四元组创建一对一的映射,任何元组变化都会导致新的映射。这些NAT类型在网络安全和P2P通信中起到关键作用。
摘要由CSDN通过智能技术生成


参考文献:

[1](https://www.h3c.com/cn/d_201206/922128_30005_0.htm)
[2](http://www.h3c.com/cn/d_201208/751474_30008_0.htm)

1. STUN

1.1 Full cone NAT(全锥形NAT)

所有从同一个内网的(IP,端口)发送出来的请求都会被映射到同一个外网(IP,端口),且任何一个外网主机都可以通过访问映射后的公网地址,实现访问位于内网的主机设备功能。

外网主机可以主动连接内网主机

该类型NAT只与源IP和源端口相关,只要(源IP,源端口)相同则可以通过映射后的(公网IP,端口)访问任意网站,因此称之为全锥形NAT. 有点类似于静态NAT

在这里插入图片描述

1.2 Restricted Cone NAT(地址受限锥形NAT)

所有从同一个内网的(IP,端口)发送出来的请求都会被映射到通过一个外网(IP,端口),但与全锥形不同点在于:生成的映射表项与目的IP有关,只有符合要求的目的IP(要访问的公网服务器IP)才可以通讯。此NAT还有个特点:不能主动连接内网中的主机地址,连接必须由内网地址发起

限制比全锥形NAT多了:IP地址限制

此类型NAT除了与源IP和源端口相关外,还与目的IP有关,只有内网主机主动连接的公网IP才可以与内网中的主机通讯。

在这里插入图片描述

1.3 Port Restricted Cone NAT(端口受限锥形NAT)

所有从同一个内网的(IP,端口)发送出来的请求都会被映射到通过一个外网(IP,端口),但是在地址受限锥形NAT基础上增加了端口的限制。

地址受限锥形NAT时,只有内网主机主动连接的公网主机才可与之进行通讯,而不用担心端口号是否与请求的端口相同。

但是端口受限锥形NAT除了IP限制外,增加了端口限制。意思是说:除了之前主动连接了主机的(IP,port1,)可以通讯,其他的(IP,port2)等都不可以与之通讯。此NAT映射与报文的三元组绑定

在这里插入图片描述

1.4 Symetric NAT(对称NAT)

所有从同一个内网(IP,端口)发送到同一个目的IP和端口的请求都会被映射到同一个IP和端口。换句话说(SIP,Sport, DIP, Dport)只要有一个发生变化都会使用不同的映射条目,即此NAT映射与报文四元组绑定。

在这里插入图片描述

画的图有点像锥形,但实际上已经是一对一了,因此又被称之为对称NAT。

2.小结


  • 前三种nat有一个共同点:只要内网中的(IP,端口)相同的请求就会被NAT映射到同一个外网(IP,port)。

    NAT类型说明
    全锥形NAT任何公网主机都可与之通讯。双方都可以主动发起
    地址受限锥形NAT只有内网主动连接的公网主机可与之通讯,必须内网主机发起。且此公网主机可通过任意端口与内网主机通讯。
    端口受限锥形NAT只有内网主动连接的公网主机的连接可与之通讯,必须内网主机发起。且此公网只能通过固定的端口与之进行通讯。
  • 最后一种对称NAT: 一个连接一条映射(网络上的连接通过四元组表示:[SIP,DIP,SPORT,DPORT] )

    NAT类型说明
    对称NAT根据四元组创建NAT映射,四元组中的任何一项发生变化均导致NAT映射的更换。此形状双方一对一映射,因此被称之为对称NAT

端口受限锥形NAT和对称NAT的异同:

  • 不同点:

锥形NAT: 只要从同一个内网(IP,Port)发出来的请求都被映射到同一个公网(IP,Port), 至于IP是否受限、端口是否受限应该与映射无关…(猜的)

对称NAT: 根据四元组(SIP, DIP,SPORT,DPORT)创建NAT映射条目。 或者说从同一个内网(IP, Port)访问不同的公网地址会有不同的NAT映射表项。

虽然这两种NAT都与公网上的(IP,Port)有关,但一个是一对多,一个是一对一,也就是锥形和对称性的由来。

以下是一个用于检测NAT类型的Python脚本,它可以识别四种常见的NAT类型:完锥型NAT受限锥型NAT端口受限锥型NAT对称NAT。 ```python import socket def get_nat_type(): stun_servers = [('stun.l.google.com', 19302), ('stun1.l.google.com', 19302), ('stun2.l.google.com', 19302), ('stun3.l.google.com', 19302), ('stun4.l.google.com', 19302)] for server in stun_servers: try: # 创建UDP套接字 sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 连接STUN服务器 sockfd.connect(server) local_addr, local_port = sockfd.getsockname() # 发送绑定请求 sockfd.send(b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') # 接收响应 response = sockfd.recv(1024) # 解析响应数据 nat_type = ord(response[20:21]) # 关闭套接字 sockfd.close() if nat_type == 1: return "完锥型NAT" elif nat_type == 2: return "受限锥型NAT" elif nat_type == 3: return "端口受限锥型NAT" elif nat_type == 4: return "对称NAT" except socket.error: pass return "无法确定NAT类型" if __name__ == '__main__': nat_type = get_nat_type() print("NAT类型:", nat_type) ``` 此脚本使用多个公共的STUN服务器进行测试。它创建一个UDP套接字并连接到STUN服务器。然后,它发送一个绑定请求并接收响应。根据响应中的特定字节,它确定NAT类型并返回相应的结果。 请注意,由于NAT的复杂性和网络环境的多样性,这个脚本可能无法准确识别所有NAT类型。在实际应用中,还需要考虑更多的因素和测试方法来确定NAT类型。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叨陪鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值