我有以下网络配置:
- Local router 10.0.0.1, public IP 1.2.3.4
forwarding port 1002 to 10.0.0.2
forwarding port 1003 to 10.0.0.3
- Local host 10.0.0.2, server on port 1002, no default route
- Local host 10.0.0.3, server on port 1003, default route via 10.0.0.1
- Remote host public IP 5.6.7.8
没有配置防火墙。
我可以从 10.0.0.3 连接到 10.0.0.2:1002 并且没有任何问题。
我从 5.6.7.8 连接到 1.2.3.4:1003 没有任何问题,但 1.2.3.4:1002 没有响应。但是,如果我在主机 10.0.0.2 上通过 10.0.0.1 添加默认路由,连接就会开始工作。
因此,与 10.0.0.2:1002 的连接始终在本地网络上有效,但仅在启用默认路由时才可在远程主机上有效。
我不明白其中的区别:从 10.0.0.2 的角度来看,为什么来自另一个本地 IP 或转发时入站打包会有所不同?
答案1
当 10.0.0.2 收到来自 5.6.7.8 的请求并尝试响应时,如果它没有到 5.6.7.8 的明确路由或可以依赖的默认路由,它将不知道将响应发送到哪里。
解释:假设10.0.0.2和10.0.0.3在同一个子网(由子网掩码决定)
10.0.0.2 上的示例路由表(Windows 中的 ROUTE PRINT)
Network Destination Netmask Gateway Interface
0.0.0.0 0.0.0.0 10.0.0.1 10.0.0.2
10.0.0.0 255.255.255.0 On-link 10.0.0.2
(added by me)10.0.2.0 255.255.255.0 10.0.0.99 10.0.0.2
从 10.0.0.2 开始,.3 机器位于“10.0.0.0”的网络目标内。这是“On-Link”,意味着 10.0.0.2 和 10.0.0.3 位于同一逻辑链路上。因此,往返于 .2 和 .3 之间的数据包无需路由。它们直接将数据包发送给对方。不涉及路由。
当 .3 或 .2 尝试将数据包发送回 5.6.7.8 以响应来自 5.6.7.8 的请求(无论是 NAT 转发还是实际路由)时,由于 5.6.7.8 既不在直接链接上,也不在路由表的其他路由内,因此它属于网络目的地“0.0.0.0”,并且需要知道将数据包发送到何处以路由到最终目的地 - 在本例中为默认路由。
在上面的路由表中,如果 10.0.0.2 尝试发送到 10.0.2.50,它将通过位于 10.0.0.99 的另一个路由器路由数据包,因为该路由在路由表中指定。如果未指定该路由,它将返回到默认路由。
因此,如果没有明确定义到目的地的路由,并且目的地不在本地子网上,则会将其发送到默认路由器。