假设我在路由器上有两个设备,它们都有在端口 999 上监听的软件。我本地网络之外的客户端尝试通过端口 999 连接到我的公共 IP 地址。
路由器如何知道将连接请求路由到哪个设备?两个设备都在监听端口 999,但流量最终只能到达其中一个设备,不是吗?
我知道端口转发是确保数据到达正确设备的正确方法,但如果没有设置端口转发配置怎么办?路由器是否会因为不知道哪个设备是“正确”的设备而拒绝数据包?
答案1
这取决于路由器的配置方式。最常见的配置将导致数据包被忽略或导致连接被重置。通常,执行 NAT 的 SoHo 路由器仅在专门配置了端口转发或连接到路由器本身时才接受入站连接。
一个问题是,如果路由器配置了默认目的地或 DMZ,则连接将被转发到默认目的地。
另一个问题是路由器是否支持 UPnP。在这种情况下,连接将被转发到最先要求转发该端口的主机(如果有)。
最后,有些路由器具有宽容型 NAT。在这种情况下,路由器会做出最佳猜测。例如,如果最近只有一个设备处于活动状态,则该设备可能会获得连接。或者,如果某个设备之前曾与此连接所来自的 IP 地址进行过通信,则该设备可能会获得连接。
这完全取决于路由器的配置方式以及路由器支持的功能。
答案2
对于传入连接(请注意,我使用的是连接这个词,而不是数据包),如果没有任何端口转发/UPnP 设置,它将拒绝或丢弃数据包。
对于传出连接(使用 SNAT),路由器将保持“状态”。它将查看所有传出连接(为简单起见,TCP 数据包从内部到外部带有 SYN 标志),将源地址/端口重写为 WAN 连接并继续发送数据包。它知道将源地址/端口重写为什么,并且当数据包返回时,它将反转该过程以返回原始地址/端口。
因此对于我的 NAT 路由器,我将获得下表:
TCP state codes: SS - SYN SENT, SR - SYN RECEIVED, ES - ESTABLISHED,
FW - FIN WAIT, CW - CLOSE WAIT, LA - LAST ACK,
TW - TIME WAIT, CL - CLOSE, LI - LISTEN
CONN ID Source Destination Protocol TIMEOUT
201805472 10.100.0.95:62110 83.69.0.50:42018 udp [17] 7
213891648 10.100.0.95:43327 176.68.233.117:53228 tcp [6] ES 4631
213891928 10.100.0.95:38139 213.101.14.165:54764 tcp [6] ES 6995
213223160 10.100.0.95:35725 176.68.233.117:53228 tcp [6] ES 386
215913952 10.100.0.1:38340 10.100.0.11:53 udp [17] 8
205319000 10.100.0.95:62110 95.22.94.199:22634 udp [17] 41
214931472 10.100.0.95:60500 213.101.14.165:5524 tcp [6] ES 6478
205547536 10.100.1.26:37992 141.138.198.177:993 tcp [6] ES 7118
387202720 10.100.1.26:58156 141.138.198.177:993 tcp [6] ES 7122
[output omitted]
如果有从 176.68.233.117 返回的数据包,其目标端口为 53228,它会将目标地址/端口重写为 10 10.100.0.95:43327。