Ofe*_*lon 1 router routing tcpip
我正在学习私有/公共 IP、端口转发和 NAT,但仍然看不到一个简单问题的答案:
假设同一网络上的两个用户正在与其网络外部的单个服务器进行通信(例如,我和我的妻子向 yahoo.com 发送 http 请求)。服务器将两个用户视为单个公共 IP,并且通常(如本例所示)在同一端口上进行通信。路由器如何根据这两个不同的连接来路由数据包呢?数据包内是否有除 ip/端口之外的任何路由信息?是否在某处维护了一些“会话表”?它由谁以及具体包括哪些内容?
首先我们来看看如何单计算机如何区分并发连接。
\n\n大多数传输协议(例如 TCP、UDP、SCTP)使用两个端口:源端口和目标端口\xe2\x80\x93,即连接两端各一个。也就是说,数据包并不是简单地“穿过”端口;而是简单地“通过”端口。相反,它们从X 港口前往Y 港口。
\n\n目标端口通常是众所周知的(HTTP 为 80,DNS\xe2\x80\xa6 为 53),但源端口通常由操作系统本身随机选择,这也确保了 src/dst 组合是唯一的。
\n\n因此,当您的浏览器与“雅虎端口 80”建立多个连接时,所有这些连接实际上都有不同的源端口,并且操作系统会保留一个套接字表,例如:
\n\nPROCESS PROTO LOCAL REMOTE STATE\n9894/firefox tcp 192.168.6.175:39163 google.server:80 established\n9894/firefox tcp 192.168.6.175:52909 yahoo.server:80 established\n17463/chrome tcp 192.168.6.175:64981 yahoo.server:80 established\n9894/firefox udp 192.168.6.175:4984 8.8.8.8:53 --\n
Run Code Online (Sandbox Code Playgroud)\n\n因此,当操作系统从yahoo.server:80
本地端口 52909 接收到 TCP 数据包时,它可以将其映射到 Firefox 建立的特定连接。
需要注意的是,这与 NAT 无关,即使您直接连接也会发生同样的情况。(不过 NAT 会利用它。)
\n\n(您可以使用netstat -n
、 或 Windows 上的各种图形工具查看此表。通常“本地/远程”被标记为“源/目标”,尽管这并不完全准确。)
关于 NAT 的问题的答案非常相似,只是一切都是在更大范围内完成的。
\n\n执行 NAT 的路由器保留一个包含内部和外部地址和端口的“状态”表。例如,如果您的两个 HTTP 请求使用单独的 TCP 连接,则它们可能会被跟踪为:
\n\nPROTO ORIG-SRC ORIG-DST REPLY-SRC REPLY-DST\n6/tcp 192.168.6.42:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:52909\n6/tcp 192.168.6.175:39163 yahoo.server:80 yahoo.server:80 your.public.ip.addr:39163\n6/tcp 192.168.6.175:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:28330\n17/udp 192.168.6.175:4984 8.8.8.8:53 8.8.8.8:53 your.public.ip.addr:4984\n
Run Code Online (Sandbox Code Playgroud)\n\n当路由器收到来自 REPLY-SRC (Yahoo) 的发送到 REPLY-DST(您的公共 IP 地址)的数据包时,它知道必须从 ORIG-SRC 列中获取真正的目的地才能撤消 NAT。
\n\n(如果没有匹配状态,则处理手动配置的端口转发规则。如果仍然没有匹配,则数据包实际上是发送给路由器本身的。)
\n\n请注意状态表如何包含地址和端口,从而允许通过端口组合区分到同一服务器的多个连接。在我的示例中,两台计算机意外地使用了相同的端口组合,因此第二个连接的端口也被转换。
\n\n(事实上,有些 NAT只查看端口并完全忽略源地址;这减少了可能的连接数量,但使点对点程序更容易执行“NAT 打洞”。)
\n\n即使对于无连接协议(例如 UDP 或 ICMP)也会保留这种状态,因此即使没有明确的“关闭连接”数据包,条目也会在一段不活动时间间隔后过期。(状态表实际上是防火墙的一部分,因此即使未完成 NAT,路由器仍可能使用它来区分“活动”连接和杂散数据包。)
\n\n(如果您的路由器是基于 Linux 的,conntrack -L
或者cat /proc/net/nf_conntrack
会显示此表。对于 OpenBSD 或 pfSense,请尝试pfctl -s state
。)
归档时间: |
|
查看次数: |
600 次 |
最近记录: |