当收到一个数据包时,它如何知道将它发送到哪台内部机器?

网络工程 IPv4 纳特
2022-02-25 12:19:51

我熟悉 ARP 和路由,但我认为我无法在这里将两个和两个放在一起。在 IPv4 数据包上,我们有源 IP 地址,它允许任何路由器将响应发送回发送者。但是,当收到响应时,路由器如何知道是哪台机器发送了原始数据包请求并将其发回?我们有一个 IP -> MAC 地址的 ARP 表,但 IPv4 数据包上的源地址是公共 IP 地址而不是内部地址。

2个回答

在这里澄清您的问题,您有一个正在执行 NAT(网络地址转换)或可能 PAT(端口地址转换)的网络设备。当回复数据包进来时,NAT/PAT设备如何知道如何转换和转发数据包?

答案是 NAT/PAT 设备维护状态。它有一个“NAT 转换表”。以下是 Cisco ASA 上“show ip nat translations”表的示例:

Router#show ip nat translations

Pro Inside global        Inside local       Outside local      Outside global
udp 171.69.233.209:1220  192.168.1.95:1220  171.69.2.132:53    171.69.2.132:53
tcp 171.69.233.209:11012 192.168.1.89:11012 171.69.1.220:23    171.69.1.220:23
tcp 171.69.233.209:1067  192.168.1.95:1067  171.69.1.161:23    171.69.1.161:23

一个 TCP 或 UDP 套接字由 5 条信息组成:

protocol (udp or tcp)
source ip
source port
destination ip
destination port

让我们来看看上表中的第一个翻译。套接字似乎是通过端口地址转换 (PAT) 向外发起的。

protocol = udp (always unchanged)
source ip = inside local ip = 192.168.1.95
source port = inside local port = 1220
destination ip = outside local ip = outside global ip (unchanged) = 171.69.2.132
destination port = outside local port = outside global port (unchanged) = 53

唯一需要更改的是我们的源 IP(我们无法在互联网上路由 RFC1918 地址空间)和可能的源端口。

我们将本地 192.168.1.95 内部转换为全局 171.69.233.209 内部(来自我们的 NAT 池)。然后我们检查端口 1220 是否可用于 NAT 池 ip 171.69.233.209。这是!因此,我们的内部本地端口 1220 也可以针对我们的内部全局端口 1220 进行更改。

这使我们完全定义了我们的翻译,我们将其存储在翻译表中:

Pro Inside global        Inside local       Outside local      Outside global
udp 171.69.233.209:1220  192.168.1.95:1220  171.69.2.132:53    171.69.2.132:53

然后我们得到一个回复​​包:

protocol udp
source ip 171.69.2.132
source port 53
destination ip 171.69.233.209
destination port 1220

我们在翻译表中查找并找到匹配项。因此,我们将每个“全局”翻译为“本地”。在我们的例子中,唯一的变化是从“全局 171.69.233.209 内部”到“本地 192.168.1.95 内部”,结果是:

protocol udp
source ip 171.69.2.132
source port 53
destination ip 192.168.1.95
destination port 1220

然后我们愉快地将翻译后的数据包转发到我们的目的地: 192.168.1.95 !

另外两个一般性意见:

NAT 与状态防火墙非常相似。如此相似,以至于大多数供应商的产品通常都做另一种。

NAT 设备具有有限的状态表大小,因此这些条目需要超时。一个非常繁忙的 NAT(或有状态防火墙)设备可能会将其表最大化,从而导致状态表条目被快速循环并且 udp/tcp 套接字被中断。

路由器不负责响应当“客户端”主机向“服务器”主机发送请求时,“服务器”负责向请求源发送响应。网络层的路由器没有请求响应的概念,也没有“客户端”和“服务器”的概念——它们只存在于应用层。

路由器的任务是将数据包转发到其目标地址。源地址仅在路由器遇到数据包问题时使用,例如当 TTL 过期时。然后它向源发送 ICMP超时消息并丢弃数据包。

为了转发数据包,路由器会查询其路由表以获取目标地址。相应的路由条目告诉路由器使用哪个接口和网关。

在运行 IPv4 的基于 MAC 的接口上,路由器 ARP 网关并将生成的 MAC 地址用于它封装数据包的帧。

在最后的路由跃点上,目的地与路由器共享 MAC 段,因此路由器使用目的地 IP 作为网关 - 将数据包传递到目的地本身。

私有 (LAN) 和公共 (Internet) 地址之间非常频繁的转换 - NA(P)T - 打破了这个概念。NAT 路由器需要有状态并记住它正在修改的连接。当私有 IP 客户端连接到公共 IP 服务器时,NAT 路由器将其自己的公共 IP 地址替换为 LAN 客户端的源地址。同时,它将源/目标 IP 和传输层源/目标端口存储在其 NAT 表中。

当对应的数据包从之前的目的地(服务器)到达时,将目标 IP 和端口向后转换,以便将数据包转发给客户端。

因此,为了使公共 IP 数据包到达私有目的地,连接必须源自该私有目的地。这种 NAT 通常称为源 NAT

还有一个 NAT 变体允许使用私有 IP 地址到服务器的入站公共连接。为此,NAT 路由器将其传输层端口之一“转发”到 LAN 地址 - 它将以这种方式寻址的任何数据包转换为私有 IP。这称为目标 NAT反向 NAT端口转发,有时也称为虚拟 IP