路由器后面的服务器
我正在尝试在路由器后面设置一个服务器,现在我把问题简化成了以下几点:
我使用的是:
- 西门子 SL2-141 路由器。
- Windows 7 64位系统,运行 Python 2.7。
我运行了:
server.py:
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((IP, 8080)) sock.listen(1) sock.accept() print 'success' sock.close()
client.py:
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((IP, 8080)) sock.close()
- 当 IP = '127.0.0.1' 时,可以正常工作。
我设置了一个静态 IP:
> Network And Sharing Center > Change Adaper Settings > Local Area Connection > Properties > Internet Protocol Version 4 (TCP/IPv4) > Properties > Use The Following IP Address: IP Address: 10.0.0.200 Subnet Mask: 255.0.0.0 Default Gateway: 10.0.0.138 > Use The Following DNS Server Addresses: Preferred DNS Server: 10.0.0.138 Alternate DNS Server: - - - -
当 IP = '10.0.0.200' 时,也可以正常工作。
我在路由器上设置了端口转发:
> http://10.0.0.138/ > Username: Admin > Password: Admin > Advanced > Virtual Server > Port Forwarding > Add: User Defined: Test From Internal Host IP Address: ALL Forward to Internal Host IP Address: 10.0.0.200 Protocol: TCP External Packet Port Start: 8080 External Packet Port End: 8080 Forward To Internal Host Port Start: 8080 Forward To Internal Host Port End: 8080 > Apply (and reboot router, just in case).
根据我的理解,如果我把服务器的 IP 设置为 '10.0.0.200',然后把客户端的 IP 设置为我的公网 IP,应该可以工作,但并没有成功(“无法连接,因为目标机器主动拒绝了连接”)。
我尝试用 Apache 服务器做同样的事情,结果也是类似:访问本地地址可以,访问静态 IP 也可以,但访问公网 IP 不行(80 端口打开的是路由器设置页面,8080 端口则无法连接)。
最后的备注:
- 我关闭了防火墙。
- 我检查了端口是否开放(http://www.canyouseeme.org/),结果是开放的。
- 我检查了服务器是否在监听(netstat -na | find /i "8080"),结果是监听的。
有没有人知道问题出在哪里?
1 个回答
根据我的理解,如果我把服务器的IP设置为'10.0.0.200',然后把客户端的IP设置为我的公网IP,应该是可以工作的,但实际上并没有。
没错,如果客户端在外部网络上,这样设置是可以的。但如果在本地网络上使用公网地址,可能会有问题,这取决于你的路由器是否支持NAT反射(如果不支持,数据包会被丢弃)。在本地网络上,你应该使用你的本地(私有)IP地址。很多路由器允许你为本地资源配置DNS记录,这样可以覆盖DNS服务器的记录,形成一种“分割DNS”。这样你就可以用一个DNS名称来获取正确的地址。
如果你的问题是外部网络的客户端无法连接,听起来你的NAT路由器没有正确转发端口。我不知道你用的是什么型号的路由器,但我看到这一行:
来自内部主机的IP地址: ALL
我在想你是否需要允许来自外部
的连接。
另外,你确定这个规则是启用的吗?(我问这个是因为我上次遇到类似问题时,虽然我正确创建了转发规则,但它并没有启用。)
如果你还是解决不了问题,试着删除这个规则,然后重新测试一下端口是否开放,可以去http://www.canyouseeme.org/看看。我还建议在不运行服务器程序的时候再测试一次(这样可以检查外部端口扫描是否误导,因为这种情况是有可能发生的)。
最后,当你写到:
我关闭了防火墙。
你是指Windows防火墙吗?你也要仔细检查一下,因为Windows防火墙可能允许本地连接,但会阻止远程连接。