快速摘要:转发端口从外部世界可以工作,但从使用外部 IP 的内部网络连接被拒绝。
为了便于解释,我们简化了以下情况:
我有一台在端口 12345 上运行服务的计算机。这台计算机的内部 IP 为 192.168.1.100,并直接连接到调制解调器/路由器,该调制解调器/路由器的内部 IP 为 192.168.1.1,外部(公共、静态)IP 为 1.2.3.4。(路由器是 TP-LINK TD-w8960N)我已在端口 12345 设置了端口转发(虚拟服务器),以转到 192.168.1.100 的端口 12345。
如果我从同一台计算机运行 telnet 192.168.1.100 12345,一切正常。但运行 telnet 1.2.3.4 12345 时,显示连接被拒绝。如果我在另一台计算机上执行此操作(在同一个内部网络上,连接到路由器),也会发生同样的事情。这似乎是端口转发不起作用。然而...
如果我在我的外部 IP 和服务端口上运行在线端口检查服务,它会显示端口已打开,我可以看到远程服务器正在连接并立即关闭连接。使用另一台通过移动连接连接到互联网的计算机,我也可以使用 telnet 1.2.3.4 12345,并获得有效的连接。
因此,端口转发似乎有效,但是使用内部网络的外部 IP 则无效。我不知道是什么原因造成的,因为另一个非常类似的设置(不同的路由器)对我来说是有效的。我可以通过内部和外部 IP 从网络内部访问服务器上运行的服务。
笔记:我知道我可以使用网络内部的内部 IP 来访问此服务。但如果我有一台必须能够从内部和外部执行此操作的笔记本电脑,那么在软件配置中不断在 1.2.3.4 和 192.168.1.100 之间切换会很烦人。
路由器输出:
> iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 224.0.0.0/3
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 to:192.168.1.101
DNAT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:25 to:192.168.1.101
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:110 to:192.168.1.101
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:12345 to:192.168.1.102
DNAT udp -- 0.0.0.0/0 192.168.1.1 udp dpt:53 to:217.118.96.203
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.1.0/24 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
当然行不通!当您从 LAN 连接的主机向 1.2.3.4:12345 发送数据包时,数据包会通过默认路由发送到您的路由器,路由器会将目标地址更改为 192.168.1.100。这样没问题。但是当服务器尝试响应时,它发现源地址(仍然是原来的 192.168.1.xx)位于同一个 LAN 上,因此会直接发送数据包,而不是通过路由器。因此,您的主机无法理解这些响应,因为它们的源地址(192.168.1.100)与原始数据包的目标地址(1.2.3.4)不同!
最好的解决方案是:
- 在服务器上配置
iptables
SNAT 本地地址为 1.2.3.4 - 在路由器上配置DNS缓存服务器,并将LAN IP地址分配给服务器的DNS名称。这样,外部客户端将使用外部IP,而内部客户端将使用内部IP。并且DNS名称将相同。
答案2
据我所知你不能这么做。
尝试跟踪路由连接,内部网络上的任何主机都选择 192.168.1.1 作为 1.2.3.4 的下一跳,那么路由器应该处理这个连接,但我认为它无法将连接从内部转发到内部。
您必须了解您在路由器上拥有哪个级别的控制权,如果它是一个 Linux 服务器,您可以使用 iptables,但这样的设备不提供对网络配置的控制级别。
答案3
肯定是某个地方配置了某种 IP 控制来阻止您的访问。您写道,它在类似的设置中对您有效,我可以确认,在非常相似的设置中,它也对我有效。
您是否尝试在 192.168.1.100 上的网络接口上运行 tcpdump 以查看数据包是否到达端口 12345?
tcpdump -i eth0 port 12345
数据包到达哪个 IP 地址?您的应用程序是否可能阻止此 IP 范围?
您是否检查过 /etc/hosts.deny 和 /etc/hosts.allow 配置?
答案4
我发现以下内容有效 - 摘自http://www.tomshardware.com/forum/12532-42-iptables-access-local-server-external
示例:(外部 IP 1.1.1.1、内部网络 192.168.1.0/24、Web 服务器 192.168.1.10、路由器 192.168.1.1)
通过 SSH 连接然后输入:
iptables -t nat -A PREROUTING -d 1.1.1.1 -m tcp -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
对每个已转发的端口重复此操作。
然后输入以下 ONE SNAT 规则:
iptables -t nat -A POSTROUTING -d 192.168.1.10 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1
它似乎运行良好,但我不知道如何保存它以便在路由器重启后继续存在。