在NAT(网络地址转换)和PAT(端口地址转换)之间存在一个普遍的误解,这是我们在家用路由器中经常使用的概念。
NAT
假设我们有一个具有以下拓扑的网络:
专用网络 <-------> 路由器 <-------> The_Internet
连接到Private_Network的路由器的接口具有私有IP地址,即,在The_Internet中不是唯一的IP地址。另一方面,对于NAT,路由器具有连接到The_Internet的多个接口。每个接口在The_Internet中都有一个唯一的IP地址。现在让我们假设HOST_A和HOST_B都在Private_Network,他们都希望访问Website_X在The_Internet在同一时间。Host_A的IP和端口的数据包将是:
源IP:Host_A的专用IP
源端口:Host_A上的端口
目标IP:Website_X的公共/唯一IP
目标端口:Website_X服务器正在侦听的端口
对于来自Host_B的数据包也以相同的方式进行。
如果源IP保持不变,则Website_X将回复私有的IP地址,即不是唯一的IP地址,因此数据包将永远无法找到它的返回路径。为了解决该问题,路由器检查是否未使用其连接到The_Internet的唯一IP地址之一。如果是这种情况,它将执行以下映射:
Host_A的专用IP ======= 路由器的_unique_IP_K
现在,从Host_A到Website_X并离开路由器与The_Internet连接的接口的数据包将具有以下形式:
源IP:路由器的_unique_IP_K
源端口:Host_A上的端口
目标IP:Website_X的公共/唯一IP
目标端口:Website_X服务器正在侦听的端口
因此,您可以理解,从私有IP到公共IP有一对一的关联。因此,当一个数据包从到达Website_X到路由器,该协会进行检查,目的IP地址改回私人之一,并成功地传递到正确的主机。
如您所见,此方法非常简单,但是有一个很大的缺点:每个专用主机都必须保留一个唯一的IP地址,这很昂贵,因此我们选择的唯一IP地址要比专用网络中的主机少。因此,如果所有专用主机都尝试同时访问The_Internet,则仅其中一个子集等于路由器可用的可用公共IP地址的数量。拥有,将有权使用,其余的将被拒绝。
为了解决这个问题,我们创建了PAT。
PAT
PAT是我们绝大多数家用路由器所使用的。基本限制是路由器具有一个唯一的IP地址,用于连接The_Internet,但是我们仍然希望允许来自私有网络的多个主机同时访问The_Internet。
我们这样做的方式与NAT的方式“相似”,但有一个主要区别:路由器没有持有IP地址池,而是拥有端口号池。更确切地说,在一个到达的分组路由器从HOST_A在Private_Network注定Website_X在The_Internet将具有以下格式:
源IP:Host_A的专用IP
源端口:Host_A上的端口
目标IP:Website_X的公共/唯一IP
目标端口:Website_X服务器正在侦听的端口
现在,路由器将执行两项任务:
- 它将源IP更改为路由器的唯一公共IP AND
- 它将源端口更改为路由器正在维护且尚未使用的池中的端口,例如Port_Z
现在,从Host_A到Website_X并离开路由器与The_Internet连接的接口的数据包将具有以下形式:
源IP:Router's_unique_IP_K
源端口:Port_Z
目标IP:Website_X的公共/唯一IP
目标端口:Website_X服务器正在侦听的端口
而路由器将继续下面的映射:
Host_A的专用IP 和Host_A上的端口======= Port_Z
为什么这样做?
现在,当数据包返回时,路由器只需检查目标端口号并根据前面提到的映射更改目标IP地址和目标端口号,即可成功交付数据包。
如果我在同一主机上运行多个应用程序该怎么办?
根据定义,不同的应用程序将具有不同的端口,因此它们将映射到与Router不同的端口。
如果多个主机尝试同时访问The_Internet且它们都使用同一应用程序怎么办?
根据定义,不同的主机将具有不同的私有IP地址,因此它们将映射到路由器的不同端口。
PAT在跨层的灰色空间中处于危险的平衡状态。端口号是传输协议的一部分,而路由器则可以按照Internet协议运行。因此,从技术上讲,协议不允许这样做。因此,至少在理论上存在潜在的危险:端口池受到限制。因此,如果我的专用网络由1000个主机组成,并且每个主机都在运行port_pool / 10应用程序,则路由器上的映射表将用尽所有可用条目,并且将拒绝对应用程序的访问。
这个答案大大超出了我的预期长度,但是我希望它会有所帮助。