为什么 NAT 不仅跟踪连接,还跟踪每个数据包?

网络工程 tcp 网络 纳特 icmp
2022-02-08 02:43:29

我已经尝试过数据包跟踪器和实际的 cisco 路由器,但我发现这很奇怪:NAT 使用不同的源端口,通常是递增的,用于来自同一连接的连续数据包。这是为什么?

假设我正在从我的专用网络上的客户端 ping 外部服务器。客户端 PC 发送 3 个 ICMP 回显请求数据包。当我查看路由器上的 NAT 转换表时,有 3 个条目;从相同的源 IP 地址到相同的目标 IP 地址,但每个都有不同的端口号。不应该只有一个条目吗?顺便说一句,不同类型的 NAT 就是这种情况,包括动态 NAT 和 PAT。

这是从思科学院实验室获取的。

2个回答

NAT 对来自同一连接的连续数据包使用不同的源端口,通常是递增的。

这不是真的。请展示您必须证明的内容。如果您使用面向连接的协议,例如 TCP(这是 NAPT 支持的唯一面向连接的传输协议),您会看到该连接在整个连接期间(每个数据包)使用相同的 TCP 端口号。

假设我正在从我的专用网络上的客户端 ping 外部服务器。客户端 PC 发送 3 个 ICMP 回显请求数据包。当我查看路由器上的 NAT 转换表时,有 3 个条目;从相同的源 IP 地址到相同的目标 IP 地址,但每个都有不同的端口号。

Ping 使用无连接的 ICMP,因此您没有与 ping 的连接。此外,ICMP 不使用端口号。它使用查询 ID。ping 发送的每个 ICMP 回显请求都将使用不同的查询 ID,因为(对于 ICMP)它是不同的查询。

简而言之,思科ECHO REQUEST在其输出中将 ICMP 序列号显示为“端口”,在本例中为 2368。正如 Ron 在评论中解释的那样,“这些是 ICMP 查询 ID,每个 ICMP 查询使用不同的查询 ID,因为它是一个不同的查询。”

gw#show ip nat translations  icmp
Pro Inside global      Inside local       Outside local      Outside global
icmp XXX.YYY.Z.22:2368 192.168.0.28:2368  8.8.8.8:2368       8.8.8.8:2368

这是输出的数据包,注意 ICMP 数据包 id 2368。(在发送主机上捕获,即在 NAT 内部)

11:25:01.914477 IP (tos 0x0, ttl 64, id 2073, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.28 > 8.8.8.8: ICMP echo request, id 2368, seq 2, length 64

以及回复,注意 ICMP 数据包 id 2368。

11:25:01.938002 IP (tos 0x0, ttl 120, id 36926, offset 0, flags [none], proto ICMP (1), length 84)
    8.8.8.8 > 192.168.0.28: ICMP echo reply, id 2368, seq 2, length 64