![PAT 内部结构。它是如何解复用的?](https://linux22.com/image/1390653/PAT%20%E5%86%85%E9%83%A8%E7%BB%93%E6%9E%84%E3%80%82%E5%AE%83%E6%98%AF%E5%A6%82%E4%BD%95%E8%A7%A3%E5%A4%8D%E7%94%A8%E7%9A%84%EF%BC%9F.png)
问题:假设我的家庭互联网路由器上启用了 PAT,那么当路由器从互联网接收到数据包时,如何知道将数据包解复用到哪些主机?
示例:我的 LAN 上有 2 台主机。每台主机都向同一台服务器发送请求以获取相同信息。每台主机都使用相同的端口。路由器如何知道哪些数据包应该发往何处?每个数据包都应具有相同的源地址和目标地址。端口应该相同,除非存在一些我不知道的端口魔法。
我的猜测:我猜测数据包中附加了一些我不知道的元数据,这些数据以某种方式识别了专用网络上的每个主机。但这在下一个示例中似乎不起作用。
示例:不同网络上的某个主机(其他)想要向我的 LAN 上的主机(我的)发送数据包。另一台主机将数据包发送到我的网络的公共 IP 地址。但由于我的主机没有收到该数据包,因此它无法向我的路由器提供有关如何对数据包进行解复用的任何元数据。而另一台主机除了我的网络的公共 IP 地址之外,不知道其他元数据。
答案1
执行网络地址转换的设备维护一个转换表,其中包含有关源和目标 IP 地址以及端口号的信息。源 IP 地址和端口号以及目标 IP 地址和端口号的组合为每个会话创建唯一的标识符。
答案2
源端口。
NAT 内的每个客户端都会分配一个随机的高号端口作为其与服务器连接的源端口。
当路由器转换请求时,它还会设置源端口,并跟踪分配给哪个连接的源端口。因此,当 Web 服务器发回源端口为 80、目标端口为 35201(或其他端口)的内容时,路由器会查找已分配给哪个网络客户端连接为 35201。
请注意,这意味着 Web 服务器可能不是知道原始客户端请求的源端口是什么,路由器将其转换为哪个源端口。(请求中的源端口将成为响应中的目标端口。)
答案3
我只是想继续上面的答案,关于您提到的外部设备试图访问您的内部主机的例子,因此基于上述内容,默认情况下您的路由器将丢弃从互联网发起的流量,因为它不知道您局域网中的哪个内部主机应该接收流量,因为路由器的 NAT 表中还没有为此创建条目。
允许从互联网进入您的局域网的流量的方法是定义一个特定的端口转发规则,也称为静态 nat,这样当流量从互联网进入端口 80 时,您告诉路由器,请将此流量转发到局域网上我的网络服务器,例如 IP 和端口 192.168.1.5:80。