我正在尝试在路由器后面设置服务器,并且我已经能够将其减少到以下问题:
我用:
我跑:
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:
> 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服务器做同样的事情,结果很相似:浏览localhost工作,浏览静态IP工作,但浏览公共IP不起作用(端口80给了我路由器设置页面和端口8080无法连接)。
最后的说明:
任何想法是什么问题?
答案 0 :(得分:1)
据我了解,如果我离开服务器IP '10 .0.0.200'并将客户端IP设置为我的公共IP它应该可以工作,但它不起作用。
如果客户端在外部网络上,那是对的。在本地网络上,如果您使用公共地址,它可能会或可能不会工作,具体取决于您的路由器是否实现NAT反射(如果不是,它将丢弃数据包)。您应该使用本地网络上的本地(私有)IP地址。许多路由器允许您为本地资源配置DNS记录(从DNS服务器覆盖记录,实现一种“拆分DNS”)。这样,您就可以使用一个DNS名称来获取正确的地址。
如果问题是来自外部网络上的客户端的连接,听起来好像你的NAT路由器不是端口转发。我没有你的路由器型号,但我看到这一行:
来自内部主机IP地址:全部
并且想知道你是否必须允许From External
。
您还确定此规则已启用吗? (我只是问,因为我上次遇到这样的问题时我已正确创建了转发规则,但未启用。)
如果您仍然卡住,请尝试删除该规则并重新测试该端口是否向http://www.canyouseeme.org/开放。我还会在不运行服务器程序时重新测试(测试外部端口扫描是否会产生误导,这可能会发生)。
最后,当你写:
我关掉了防火墙。
您的意思是Windows防火墙吗?您还需要仔细检查,因为Windows防火墙可以在阻止远程连接时允许本地连接。