我最近发现,连接到 WiFi 路由器的所有设备都具有相同的外部 IP。称之为20.20.20.20
。我不明白的是路由器如何确定来自哪个 IP 的数据包WAN
应该转发到 上的哪个设备WLAN
。
确切地说,我有以下拓扑:
PC (192.168.1.149) --
|
|-----> (192.168.1.1) WiFi router (20.20.20.20) ----> WAN
|
Phone (192.168.1.139) --
我首先想到的是路由器会转发来自WAN
所有设备的所有流量,但捕获的流量tcpdump
并PC
没有显示手机的流量。通过谷歌搜索,我了解到所有路由器都在执行 NAT,但问题是iptables -t nat
在这种情况下会是什么样子?
确切地说,如何处理TCP
来自PC
和Phone
到同一外部 IP(例如30.30.30.30
和端口)的连接。22222
另外,如果我向 IP 发送一个随机 IP 数据包,20.20.20.20
它会被转发到哪个设备?
答案1
以下是非常基本的解释。
您的设备使用私有地址。私有地址是具有以下 IP 地址的子网/网络(请参阅RFC 1918):
- 10.0.0.0 至 10.255.255.255
- 172.16.0.0 至 172.31.255.255
- 192.168.0.0 至 192.168.255.255
私有地址不会在互联网上路由(理论上,它们可以由 ISP 路由并阻止它们)。它们(私有地址)使用您的公共地址通过 NAT(网络地址转换)或 PAT(端口地址转换)进行转换。
对于外部世界来说,从路由器发出的数据包具有相同的地址。当路由器收到必须路由到外部网络的数据包时,它会添加一个端口号(在 PAT 的情况下)以区分发送该数据包的设备。它会随机化端口号并防止其路由表上的两个设备使用相同的端口。因此,尽管使用了相同的公共地址,但端口号会有所不同。
答案2
通过谷歌搜索,我了解到所有路由器都在执行 NAT
NAT 仍然是一个“附加”功能在上面实际路由。当回复到达时,在 NAT 之后它仍然遵循常规路由过程。
但问题是,在这种情况下 iptables -t nat 会是什么样子?
这只是一条规则——大部分工作由单独的“conntrack”子系统完成。
对于出站连接,路由器只需要一个SNAT
或MASQUERADE
规则:
-t nat -A POSTROUTING -o <wan_interface> -j MASQUERADE
(这两个操作相同,只是‘MASQUERADE’会自动选择要使用的 IP 地址 - 它将使用 WAN 接口的任何地址,而‘SNAT’则需要在规则中指定一个地址。)
整个-t nat
表很特殊,因为数据包只有在与任何 conntrack 状态不匹配时才会通过它。您可以使用conntrack -L
查看活动状态的列表。
连接的第一个数据包命中 iptables 规则并建立状态,其余一切都由 conntrack 完成 - 当回复到达时,逆向转换由 conntrack 完成。
(Conntrack 既用于过滤规则和NAT 规则 - 例如,-m state --state established
即使没有进行 NAT,通用过滤规则也依赖于相同的 conntrack - 所以即使在非路由器系统上或未配置 NAT 的路由器上看到大量状态也不要感到惊讶。)
“端口转发”类似;它是一个DNAT
规则。
-t nat -A PREROUTING -i <wan_interface> -d <wan_ip> -p tcp --dport <wan_port>
-j DNAT --dnat-to <lan_ip:port>
具体来说,如何处理从 PC 和手机到同一外部 IP(例如 30.30.30.30 和端口 22222)的 TCP 连接。
这两个连接来自不同的来源端口。这与你的 Web 浏览器与同一台服务器建立两个相同连接的情况相同 - 即使目标端口相同,源端口也是随机选择的,以便产生唯一的(src, dst, proto, sport, dport)
组合。
使用 NAT,如果两个设备碰巧选择相同的源端口,则路由器将转换源端口以保持唯一性。
(我有一个更好的例子互联网服务器如何响应来自私有 IP 的请求?)
查看 conntrack 表时,请注意“orig”和“reply”字段不仅包含 IP 地址,还包含端口。如果入站数据包到达 REPLY-IP:REPLY-PORT,则会将其 NAT 为 ORIG-IP:ORIG-PORT,从而允许在需要时将“本地”端口(从 PC 的角度来看为源端口)设为唯一。
另外,如果我向 IP 20.20.20.20 发送一个随机 IP 数据包,它会被转发到哪个设备?
无,除非 iptables 规则明确将其 NAT 到某个地址。
WAN IP 地址不属于你的 LAN 整体,而是专门属于路由器这一设备,因此默认情况下,此类数据包的处理方式与你连接到路由器本身。
答案3
它们跟踪每个实时设备级别的端口。
外部 IP 位于 WAN 网络上,因此与它的连接将由路由器通过 TCP/IP 或“传输层”上的特定本地和远程端口来处理。
否则,就没有办法进行 NAT。
为了再次检查所述答案,进行了搜索。
看起来有人同意。说实话,这是唯一有意义的事情。
因此,在路由器后面的网络上以及其他本地网络硬件上,第 2 层是可见的,其中包含参与网络对话的“实时”设备的硬件或 MAC 地址。
这些地址无法超越本地子网,当流量到达路由器时,本地子网通常会被逻辑终止。
IP 地址由本地设备或 dhcp 服务器分配并强制执行。
在过去的混乱时期,当两个第二层地址具有相同的第三层地址时,这可能会导致所谓的 IP 冲突。
现在,这一切都是为了本地网络的方便,因为很明显,在通过与其网络接口的硬件进行互联网连接的情况下,外部 IP 地址是由 ISP 租用的。
您的计算机和设备想要访问互联网地址,但都会共享路由器的 WAN 端口上的 IP 地址,那么在伪造 TCP/IP 套接字连接或打开软件端口来监听传入连接时通常包含哪些信息?
监听服务器的软件端口的启动方式相同,因为它通过此端口宣传其服务。
侧记:我们的文化再次背离了现实。
网络的设计方式是,即使您更改子网掩码,您也需要路由器将网络流量从一个设备传递到另一个设备,因为地址范围不匹配。这也意味着更有效地控制流量,而不是仅仅像集线器一样,将数据包从每个端口重复发送出去,直到另一个设备响应。
无论如何,我与www.google.com:80。
我的 IP 地址是 192.168.1.2。
路由器(第 3 层设备)看到此信息后会说……“该死,该怎么办……该怎么办……”。它会检查其路由表中是否已配置默认路由或特定 IP 范围,然后路由器会说“目标 IP 地址是这个,如果我已配置与特定硬件端口关联的 IP 范围,则使用此路由,否则使用默认路由”,然后它会将地址转换为硬件端口 IP 设置的下一个网络。
因此,它所做的就是更新一个数据结构,列出本地 IP 与其他地方 IP 之间应该正在进行的连接,并有一个表显示“哪个端口到达这个 IP 地址”。
所以它说“好的,嘿谷歌(抱歉,请原谅我的文字游戏),嘿谷歌,我想在端口 80 上连接到你”现在外部 IP 地址就是谷歌看到的。
因此谷歌说“好吧,我需要清除此端口以接受其他连接,所以这是第一个可用端口 62433”(或者可能是随机的,谁在乎呢)。与此同时,您的本地设备已经决定了它的本地端口是什么,我们假设是 5020,路由器说“好的,我代表您连接,在端口 6120 上与我交谈”,但路由器正在 62433 上与谷歌交谈,而谷歌正在端口 5111 上与它交谈。
因此,您有一个数据结构,它可能会跟踪连接年龄以用于超时目的,并说:
192.168.1.2, 5020, 6120,www.google.com,5111,62433,
现在交易可以继续了。
通过几个复制此信息的网络跳跃进行谷歌搜索,将其响应从端口 62433(可能是另一个路由器提供的端口)中继到端口 5111 上的外部 IP 地址,路由器查找这个并说“哦,是这个项目,它也要去”192.168.1.2 在端口 5020 上从端口 6120,在这个物理端口上(或者是它的 wifi,抱歉,没有端口只有 wlan 设备),它更新传输层的报头,然后在发出一堆噪音并等待数据包已收到的确认后,在本地网络上丢弃一个帧。
合理 ?
PS 请注意它存储上次活动日期的格式,但这是必要的,否则您将有许多端口被正在进行的连接占用,并且在连接断开或超时的情况下,您的硬件将没有更多的软件端口。
我很确定,在回复发回时,WAN 上主机的原始 IP 始终保持不变,因此其间发生的所有神奇事情都会在每次主要硬件跳跃时复制此过程。
您可以在某种程度上看到这一点,尽管其中一些内容通过使用 traceroute 实用程序进行了混淆,但它会向您显示跳数。
您还可以使用像 wireshark 这样的数据包嗅探器查看数据包活动。