使用 Windows 防火墙时,当我收到连接时,原始 IP 将显示为我的路由器/网关的 IP 地址,而不是连接的实际原始 IP 地址。我的路由器是 ASUS RT-N16,dd-wrt build 14896,我遇到此问题的服务器运行的是 Windows Server 2008 R2 SP1。
2012-08-05 23:01:03 ALLOW TCP 192.168.1.1 192.168.1.11 60597 25565 0 - 0 0 0 - - - RECEIVE
2012-08-05 23:01:04 ALLOW TCP 192.168.1.1 192.168.1.11 60601 3389 0 - 0 0 0 - - - RECEIVE
2012-08-05 23:01:12 ALLOW UDP 192.168.1.11 192.168.1.1 55238 53 0 - - - - - - - SEND
192.168.1.11 是我的服务器的 IP 地址,192.168.1.1 是我的路由器的 IP 地址。我尝试过打开/关闭 DMZ 和打开/关闭 Windows 防火墙,结果相同。
此外,我的 Minecraft 服务器也只显示我的路由器的 IP 地址,而不是实际玩家的 IP 地址(日志中的名称更改为“玩家”):
[INFO] player[/192.168.1.1:59069] logged in with entity id 10445 at (-782.984331133011, 99.63587500882896, 294.12718027903713)
[INFO] player[/192.168.1.1:49865] logged in with entity id 145517 at (-166.5, 64.62000000476837, 257.5)
答案1
您的公共 IP 已分配给您的路由器。并且它是您唯一可以从 LAN 外部访问的 IP。如果有人连接到您的路由器的 IP 地址,数据包将转到您的路由器。
路由器无法将该数据包转发到以路由器 IP 地址为目的地的服务器。如果这样做,您的服务器只会将其转发回路由器,而不是在本地处理它。
同样,为了使返回数据包到达正确的目的地,路由器必须确保回复到达路由器。因此源地址(服务器看到的)将始终位于路由器的方向(永远不会是另一个 LAN IP)。
因此,这都是端口转发和发夹式 NAT 的预期行为。来自 LAN 外部的连接应在服务器上显示正确的源 IP 地址。否则,路由器会重写所有内容,以确保所有数据包都通过路由器。