NAT技术

目录

前言

IP地址短缺问题并不是一个只有在将来某个时候可能发生的理论问题。现在,此时此地,这个问题已经发生。对于整个Internet而言,长期的解决方案是迁移到IPV6,它有128位地址。这个迁移过程正在缓慢地进行着,可能需要很长一段时间才可以完成。

为了在IPV6迁移的期间找到临时方案,今天普遍使用的解决方案是网络地址转换(NAT)。

一、NAT的基本思想

NAT的基本思想是Internet服务提供商(ISP,Internet Service Provider)为每个家庭或企业分配一个IP地址(或者,最多分配少量的IP地址),用这个IP地址来传输Internet流量。在客户网络内部,每台计算机有唯一的IP地址,该地址主要用来路由内部流量。当一个数据需要离开客户网络,发向其他ISP时,它需要执行一个地址转换,把内部唯一的IP地址转换成那个共享的IP地址。

通常,我们把由ISP分配的IP地址称为公网IP;
在客户网络内部的每一台计算机的IP地址称为私网IP,一般由一个DHCP服务器自动分配。

这种地址转换使用了IP地址的三个范围,这些地址已经被声明为私有化。任何网络可以在内部随意地使用这些地址。仅有的规则是不允许包含这些地址的数据包出现在Internet上 。这3个保留的地址范围为:

NAT的操作过程如下:

当一个数据包离开客户驻地时,首先经过一个NAT盒子(NAT box),NAT盒子将数据包的内部的IP地址(图中为10.0.0.1,私网IP)转换成客户拥有的真实IP地址(图中为198.60.42.12,公网IP)。

NAT盒子通常与防火墙组合成一个单一的设备,防火墙提供一种安全机制,它仔细地控制着进出客户网络的流量。

现在,NAT盒子一般集成到路由器或ADSL调制解调器中。

当一个数据包从客户网络经过地址转换之后发往Internet后,当应答数据包返回时(比如从Web服务器返回的应答包),本质上它的目标IP地址是198.60.42.12,也就是说应答包的目标IP地址。那么,当NAT收到这个包后,如何将应答数据包发给哪个客户网络的IP地址(私网IP)?

NAT的设计者们注意到,大多数IP数据包携带的要么是TCP有效载荷,要么是UDP有效载荷。无论是TCP,还是UDP,这两个协议的头都包含了一个源端口和目标端口字段。
NAT设计者利用发送方的源端口字段去解决这个问题 。下面以TCP头的源端口为例说明:
任何时候当出境数据包进入NAT盒子,其源地址10.0.0.1被真实的IP地址198.60.42.12取代,而且TCP的源端口(Source Port)字段被一个索引值取代,该索引值指向NAT盒子的地址转换表中的65536表项之一。该表项包含了原来的IP地址和原来的源端口。最后,NAT盒子重新计算IP头和TCP头的校验和,并将校验和插入到数据包中。(注:下图只是说明过程,并非真实的数据包格式和转换表)

当一个数据包从ISP到达NAT盒子时,从TCP头取出源端口字段,得到索引值,更加索引值查找NAT盒子的映射表。找到对应的表项后,从该表项提取出内部IP地址和原来的TCP源端口,并将它们插入到数据包中。然后重新计算IP和TCP校验和,并插入到数据包中。最后将该数据包传递给客户内部的路由器,它使用10.x.y.z地址进行正常的路由。

二、NAT的局限性

第一、因为NAT盒子上的映射是由出境数据包建立的,只能在出境数据包之后到达的入境数据包才能被接受。这意味着,家庭网络用户可以通过NAT与一台远程Web服务器建立TCP/IP连接,但远程用户无法与家庭网络的一台游戏服务器建立连接,这种情况需要特殊的配置技术或NAT穿越技术。

第二、NAT违反了最基本的协议分层规则,第K层不应该对第K+1层在本层的有效载荷中放什么做任何假设。

第三、Internet上的进程并不一定必须使用TCP或UDP。如果机器A上的一个用户觉得使用一种新的传输协议与机器B上的用户进行通话,那么,由于NAT的介入,这样的应用将无法工作。

第四、有些应用以规定的方式是使用多个TCP/IP连接或者UDP端口。例如,标准的文件传输协议(FTP,File Transfer Protocol)在数据包正文插入IP地址,接受正文提取这些地址,并使用它们。但NAT对这次安排一无所知,那么就无法进行正确的传输。

总结

相关推荐
知北游天6 分钟前
Linux网络:使用UDP实现网络通信(服务端&&客户端)
linux·网络·udp
半桔8 分钟前
【网络编程】TCP 粘包处理:手动序列化反序列化与报头封装的完整方案
linux·网络·c++·网络协议·tcp/ip
ZeroNews内网穿透13 分钟前
新版发布!“零讯”微信小程序版本更新
运维·服务器·网络·python·安全·微信小程序·小程序
小白银子9 小时前
零基础从头教学Linux(Day 42)
linux·运维·服务器·网络·nginx
火星MARK10 小时前
如何配置 Ingress 的 SSL/TLS 证书?
网络·网络协议·ssl
看好多桂花树10 小时前
Nginx SSL/TLS 配置
网络·nginx·ssl
程序猿费益洲11 小时前
Docker 网络详解:(一)Linux 网络虚拟化技术
linux·网络·docker·容器·云计算
云宏信息12 小时前
赛迪顾问《2025中国虚拟化市场研究报告》解读丨虚拟化市场迈向“多元算力架构”,国产化与AI驱动成关键变量
网络·人工智能·ai·容器·性能优化·架构·云计算
歪歪10012 小时前
什么是TCP/UDP/HTTP?
开发语言·网络·网络协议·tcp/ip·http·udp
luckys.one12 小时前
第12篇|[特殊字符] Freqtrade 交易所接入全解:API、WebSocket、限频配置详解
网络·ide·python·websocket·网络协议·flask·流量运营