NAT / PortForwarding / TCP/IP 如何工作?

网络工程 纳特 通讯协议
2021-07-21 17:02:37

我最近阅读了一篇题为NAT 如何工作的文章有些事情我仍然不清楚。如果有人能解释一下,我将不胜感激。

以下是有关 DynamicNAT 的文章中最令人困惑的部分:

存根域中的计算机尝试连接到网络外部的计算机,例如 Web 服务器。

路由器从存根域上的计算机接收数据包。路由器将计算机不可路由的 IP 地址保存到地址转换表中。路由器将发送计算机的不可路由 IP 地址替换为唯一 IP 地址范围之外的第一个可用 IP 地址。转换表现在具有与唯一 IP 地址之一匹配的计算机不可路由 IP 地址的映射。

当数据包从目标计算机返回时,路由器会检查数据包上的目标地址。然后它在地址转换表中查找数据包属于存根域中的哪台计算机。

1) NAT 如何知道数据包“返回”到目标计算机?

2) 如果局域网中的其他计算机连接到同一台服务器怎么办?NAT 如何知道哪个数据包应该“返回”到哪里?

3) 包头修改是否允许执行 Internet 攻击,其中“源 IP”被受害者的 IP 替换,应答服务器将用不需要的包淹没受害者?

我想需要涉及多个攻击者......

4)StaticNAT 是否等同于所有端口的PortForwarding?

2个回答

NAT(网络地址转换)和PAT(端口地址转换)之间存在普遍的误解,这是我们在家庭路由器中主要使用的。

NAT
让我们假设我们有一个具有以下拓扑结构的网络:

Private_Network <------->路由器<-------> The_Internet

连接到Private_Network路由器接口一个私有 IP 地址,即在The_Internet 中不是唯一的另一方面,在NAT的情况下Router多个接口连接到The_Internet每个接口在The_Internet 中都有一个唯一的 IP 地址现在让我们假设HOST_AHOST_B都在Private_Network,他们都希望访问Website_XThe_Internet在同一时间。Host_A的 IP 和端口的数据包将是:

源 IP:Host_A的私有 IP
源端口:Host_A上的端口
目标 IP:Website_X的公共/唯一 IP
目标端口:Website_X的服务器正在侦听的端口

对于来自Host_B的数据包也是如此
如果源 IP 保持不变,则Website_X将回复一个私有的 IP 地址,即不是唯一的,因此数据包将永远无法找到它的返回方式。为了解决这个问题,路由器会检查他连接到The_Internet 的唯一 IP 地址之一是否未被使用。如果是这种情况,它会执行以下映射:

Host_A的私有 IP ======== Router's_unique_IP_K

现在从Host_A开始到Website_X并且现在离开连接到The_Internet路由器接口的数据将具有以下形式:

源 IP:Router's_unique_IP_K
源端口:Host_A上的端口
目的 IP:Website_X的公共/唯一 IP
目的端口:Website_X的服务器正在侦听的端口

这样你就可以理解私有IP到公有IP是一一关联的。因此,当一个数据包从到达Website_X路由器,该协会进行检查,目的IP地址改回私人之一,并成功地传递到正确的主机。
可以看到,这种方法很简单,但是有一个很大的缺点:每个私网主机都必须保留一个唯一的IP地址,成本很高,因此我们选择了比私网主机少的唯一IP地址。因此,如果所有私有主机同时尝试访问The_Internet,只有其中的一个子集,等于路由器可用的公共 IP 地址数has, will have access,其余的将被拒绝。
为了反驳我们创建了PAT

PAT
PAT是我们绝大多数家用路由器使用的。基本限制是路由器有一个唯一的 IP 地址,用于连接到The_Internet,但我们仍然希望允许私有网络中的多个主机同时访问The_Internet
我们这样做的方式与NAT的方式“相似”,但有一个关键区别:路由器持有一个 IP 地址池,它持有一个端口号池。更确切地说,在一个到达的分组路由器HOST_APrivate_Network注定Website_XThe_Internet将具有以下格式:

源 IP:Host_A的私有 IP
源端口:Host_A上的端口
目标 IP:Website_X的公共/唯一 IP
目标端口:Website_X的服务器正在侦听的端口

现在路由器将执行两项任务:

  1. 它将源 IP 更改为路由器的唯一公共 IP
  2. 它将源端口更改为路由器正在维护且尚未使用的池中的端口,例如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映射到不同的端口

如果多个 Host 尝试同时访问The_Internet并且它们都使用相同的应用程序怎么办?
根据定义,不同的主机将具有不同的私有 IP 地址,因此它们将从路由器映射到不同的端口

PAT在跨层的灰色空间中处于危险的平衡状态。端口号是传输协议的一部分,而路由器则可以按照 Internet 协议运行。所以从技术上讲,这是协议所不允许的。因此,至少在理论上存在潜在危险:端口池是有限的。因此,如果我的专用网络由 1000 台主机组成,并且每台主机都运行 port_pool/10 应用程序,则路由器上的映射表将耗尽可用条目,并且将拒绝对应用程序的访问。

这个答案大大超出了我的预期长度,但我希望它有帮助。

路由器知道数据包属于哪里,因为The router saves ... an address translation table.它记住它所做的内外地址转换。因此,一个内部地址等于一个外部地址,并且互联网外目的地是无关紧要的。当然,这忽略了几乎每个 NAT 路由器中存在的防火墙,它跟踪完整的连接:

(inside) src:ip+port,dst:ip+port <-> (outside) src:ip+port,dst:ip+port

NAT 可以更改 ip 和/或端口的任意组合。

#3 是完全不同的主题:欺骗

#4 “静态 NAT”,或“1 对 1”,是仅地址映射。因此,端口(甚至协议:tcp、udp、gre 等)是无关紧要的。