路由器如何知道如何将数据包路由到我的终端?

网络工程 路由 纳特
2021-07-16 14:48:00

假设我有一个由 2 台计算机组成的网络,每台计算机的私有网络地址为 192.168.1.101 和 192.106.1.102。

对于我的公共 IP 地址,它是 10.2.10.172。

当我向 google.com 发出 http 请求时,我的计算机将向路由器发送源 IP 地址为 192.168.1.101 的数据包,NAT 会将其更改为 10.2.10.172。

我的问题是,当 google.com 收到请求并将回复发送回 10.2.10.172 时,路由器如何知道要路由到哪台计算机?(192.168.1.101 或 192.168.1.102)。

一开始我在考虑端口号,但我认为我们可以同时浏览同一个网站,所以我不知道它在这里是如何工作的。

2个回答

NAT
如果您使用静态(一对一)NAT,路由器会将11.2.10.172公共 IP分配给192.168.1.101尝试访问 google.com的第一台 PC(例如)。在这种情况下,两台 PC 将无法同时与 google.com 通信,因为唯一可用的公共 IP 已经分发。
路由器中的 NAT 表:
11.2.10.172 -> 192.168.1.101

PAT
在您的情况下,PAT(NAT 重载)是解决方案。
使用 PAT,可以将多个地址映射到一个私有 IP。当设备发起 TCP/IP 会话时,它会生成一个 TCP 或 UDP 源端口号来唯一标识该会话。当路由器收到此数据包时,它使用该源端口号来唯一标识转换。

示例
PC1 ( 192.168.1.101)64.233.161.1使用随机源端口号 (1444)向 google.com ( )发出 HTTP 请求PC1 将发送一个带有DA: 64.233.161.1:80 | SA: 192.168.1.101:1444. 当路由器收到这个数据包时,它会插入11.2.10.172:1444 -> 192.168.1.101:1444到 NAT 表中,然后将数据包的 L3 地址更改为DA: 64.233.161.1:80 | SA: 11.2.10.172:1444并将其转发到 google.com。
谷歌回应DA: 11.2.10.172:1444 | SA: 64.233.161.1:80路由器接收此数据包并将其转换为,DA: 192.168.1.101:1444 | SA: 64.233.161.1:80然后将其转发到 PC1。

如果 PC2 ( 192.168.1.102) 发送的数据包的源端口号与 PC1 相同,则路由器只需将端口号增加 1。在这种情况下,NAT 表将如下所示

11.2.10.172:1444 -> 192.168.1.101:1444
11.2.10.172:1445 -> 192.168.1.102:1444

我希望它有点帮助。

更新
正如@CraigConstantine 所注意到的,10.2.10.172仍然在私有地址空间中,所以我已将其更改为11.2.10.172.

您的路由器知道将流量路由到哪里,因为它维护一个有状态连接表,这些连接是源 IP 地址:端口和目标 IP 地址:端口关系。这些是根据您的防火墙规则、NAT 策略和一些其他设置(如 TCP 和 UDP 超时)建立的。有 4 种可能的状态:NEW、RELATED、ESTABLISHED 和 INVALID。根据您的防火墙规则,您的防火墙确定连接应该处于什么状态。因此,通常情况下,您可以默认创建新的出站连接,但如果您创建 NAT 或 PAT 规则并匹配防火墙策略,则只允许入站的相关或已建立的连接允许这样做。

然后,根据您配置的规则(对于新连接的情况)或现有的连接表(对于已建立的连接),将允许或不允许数据包通过。

此外,维护了一个 [ARP] 表,这有助于防火墙了解IP 地址对应的物理MAC 地址