主要问题:
数据位于哪个网络层,以便网关(使用 NAT)知道数据包是发往哪台计算机?
有人能解释一下这个过程是如何进行的吗?在解释这个过程时,是否有可能回答以下问题/疑虑:我假设数据(区分网络中需要将传入数据包发送到哪台 PC)转换对于每个网关设备都是唯一的?(我认为,否则您可以从网络外部找出数据包是发往网络中的哪台计算机,但话又说回来,这可能不一定是安全问题?)
答案1
对于任何 TCP 或 UDP 连接,数据包的寻址由四个部分组成:源 IP 地址、目标 IP 地址、源端口和目标端口。
目标 IP 是您要连接的服务器,目标端口是您要连接的端口,例如,对于 http 连接,目标端口是 TCP 端口 80。源端口是“临时的”,这意味着它是从一个范围内选择的,没有特定含义。范围在 1024-65535 之间。端口选择取决于操作系统,但选择哪个端口并不重要。
源 IP 地址是发起连接的 PC。假设连接地址为 222.222.222.222:80,我们有两台 PC 内部连接到此 IP 地址,分别为 10.1.1.1 和 10.1.1.2
因此,当数据包开始时,它们可能被这样寻址:
10.1.1.1:3434 -> 222.222.222.222:80
10.1.1.2:5455 -> 222.222.222.222:80
响应数据包被反转,如下所示:
222.222.222.222:80 -> 10.1.1.1:3434
222.222.222.222:80 -> 10.1.1.2:5455
因此我们可以看到,源端口是允许返回数据包到达发送方的端口。
当我们通过 NAT 路由器时,源 IP 会更改为路由器的 IP - 在本例中为 111.111.111.111。因此数据包如下所示:
111.111.111.111:3434 -> 222.222.222.222:80
111.111.111.111:5455 -> 222.222.222.222:80
因此,只要路由器跟踪连接的源端口,它就知道应该将响应端口 3434 的数据包发送到 10.1.1.1。这就是 NAT 转换表。
但是如果我们的两台电脑恰好选择了相同的源端口怎么办?
10.1.1.1:3434 -> 222.222.222.222:80
10.1.1.2:3434 -> 222.222.222.222:80
经过 NAT 处理的数据包如下所示:
111.111.111.111:3434 -> 222.222.222.222:80
111.111.111.111:3434 -> 222.222.222.222:80
因此,发往 10.1.1.1 的响应数据包 3434 与发往 10.1.1.2 的响应数据包没有区别。
为了解决这个问题,路由器不仅会更改源 IP 地址,还会更改源端口。这样,路由器就可以确保每个传出的连接都有唯一的源端口,并保留一个转换表来更改响应数据包的 IP 和端口,以便将它们发送到正确的发起者。
回答你的安全问题,实际上,路由器只需求在发生冲突时更改源端口,但大多数情况下都会更改源端口,并选择随机源端口。这使得很难预测下一个选择的源端口是什么,也使得攻击者更难将数据包注入序列。
答案2
通常在家用路由器中NAT 在第 4 层运行。在 TCP 和某些 UDP 连接中,路由器将查看源端口和目标端口,以创建 NAT 转换表,将实际 IP 地址和端口映射到经过 NAT 的 IP 地址和端口。这称为过载 NAT 或 PAT(端口地址转换)。在某些协议(例如 DNS)中,路由器将查看数据包并使用应用层数据(正在查询的域名)来确定将 DNS 响应发送到哪个地址。
这是从 Cisco ASA 中获取的 NAT 转换表的示例:
PAT Global 216.1.250.22(400) Local 172.16.1.102(123)
PAT Global 216.1.250.22(9370) Local 172.16.1.107(13286)
PAT Global 216.1.250.22(45935) Local 172.16.1.107(36159)
PAT Global 216.1.250.22(60152) Local 172.16.1.107(10736)
PAT Global 216.1.250.22(322) Local 172.16.1.107(123)
PAT Global 216.1.250.22(48642) Local 172.16.1.44(59136)
PAT Global 216.1.250.22(24719) Local 172.16.1.44(59764)
PAT Global 216.1.250.22(17045) Local 172.16.1.44(57830)
PAT Global 216.1.250.22(44616) Local 172.16.1.44(59100)
PAT Global 216.1.250.22(19426) Local 172.16.1.44(57632)
PAT Global 216.1.250.22(38447) Local 172.16.1.44(58904)
PAT Global 216.1.250.22(6053) Local 172.16.1.44(59958)
PAT Global 216.1.250.22(49473) Local 172.16.1.44(59323)
PAT Global 216.1.250.22(55193) Local 172.16.1.44(58597)
PAT Global 216.1.250.22(38978) Local 172.16.1.44(59170)
答案3
基本上是为了传出连接时,路由器使用动态生成的“NAT 转换表”。例如,一旦启动传出连接,就会向该表添加相关条目(列出内部计算机 IP/端口、路由器上使用的传出端口、目标 IP/端口等)。当然,此表保存在路由器的内存中,不会发送到任何地方,因此 OSI 级别不适用。一旦传入数据包到达,路由器就会查阅该表以确定如何进一步处理它。
为了传入连接,路由器必须使用预定义配置,将某台内部计算机上的服务连接到某个端口(例如,将所有到 TCP 端口 80 的传入连接通过 NAT 转移到内部计算机 ABCD 端口 8080 等)。同样,此信息从未在线上明确发送。