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