打开从内部networking断开的端口

快速总结:转发的端口从外部工作,但是从内部networking使用外部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说连接被拒绝。 如果我在另一台计算机(在同一个内部networking上,连接到路由器)上执行此操作,则会发生同样的情况。 这看起来像端口转发不起作用。 然而…

如果我在外部IP和服务端口上运行在线端口检查服务,则表示端口已打开,我可以看到远程服务器连接并立即closures连接。 并使用另一台电脑连接到互联网使用移动连接,我也可以使用telnet 1.2.3.4 12345和我得到一个工作连接。

所以端口转发似乎正在工作,但是从内部networking使用外部IP不会。 我不知道是什么原因造成的,因为另一个非常像这样的设置(不同的路由器)适用于我。 我可以通过内部和外部IP访问networking内部服务器上运行的服务。


注意:我知道我可以使用networking内部的IP来访问这个服务。 但是,如果我有一台笔记本电脑,必须能够从内部和外部做到这一点,它会在软件configuration中不断地切换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 

据我所知,你不能这样做。

尝试traceroute连接,内部networking上的任何主机select192.168.1.1作为1.2.3.4的下一跳,然后路由器应该处理这个连接,但我认为它不能转发连接从内部到内部。

你必须看看你在路由器上有什么级别的控制,如果它是一个你可以用iptables玩的linux服务器,但是这样的设备不能提供这种级别的networkingconfiguration控制。

必须在某处设置一些IP控制来阻止您的访问。 你写了一个类似的设置,你可以确认这对于我来说也是非常相似的。

你是否尝试在192.168.1.100的networking接口上运行tcpdump来查看数据包是否在12345端口到达?

 tcpdump -i eth0 port 12345 

数据包到达哪个IP地址? 你的应用程序可能阻止了这个IP范围?

你有没有检查你的/etc/hosts.deny和/etc/hosts.allowconfiguration?

这里拒绝的连接似乎是有趣的。 如果这是一个路由问题,telnet会超时或者说没有路由到主机。 我将从包含该服务的盒子上的数据包跟踪开始,然后尝试通过公共IP重新连接。 这至less可以帮助你了解连接是否通过路由器。 如果它通过了,那么你应该更多的挖掘主机。 如果没有通过,路由器上可能会有防火墙或其他configuration参数,导致问题。 你可能想尝试一个不同的路由器。

我发现以下工作 – 从http://www.tomshardware.com/forum/12532-42-iptables-access-local-server-external

例如:(外部IP 1.1.1.1,内部networking192.168.1.0/24,networking服务器192.168.1.10,路由器192.168.1.1)

通过SSH连接,然后input:

 iptables -t nat -A PREROUTING -d 1.1.1.1 -m tcp -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10 

重复您已经转发的每个端口。

然后input下面的一个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 

它似乎工作得很好,但我不知道如何保存它,以保持路由器重新启动。

当然,这是行不通的! 当您将从LAN连接的主机发送的数据包发送到1.2.3.4:12345时,数据包会通过默认路由到您的路由器,从而将目标地址更改为192.168.1.100。 没关系。 但是,当服务器试图响应,它看到源地址(它仍然是原来的,192.168.1.xx)是在同一个局域网,直接发送数据包,而不是通过路由器。 所以,你的主机不知道这些响应,因为它们的源地址(192.168.1.100)与原信息包的目的地址(1.2.3.4)不一样!

最好的解决scheme是:

  1. 将服务器上的iptablesconfiguration为SNAT本地地址为1.2.3.4
  2. 在路由器上configurationDNScaching服务器,并将LAN IP地址分配给服务器的DNS名称。 因此,外部客户将使用外部IP,而内部客户使用内部IP。 而DNS名称将是相同的。