1

我正在尝试在路由器后面设置服务器,并且已经能够将其减少到以下问题:

我用:

  1. 西门子 SL2-141 路由器。
  2. 带有 Python 2.7 的 Windows 7 64 位。

我跑:

  • 服务器.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()
    
  • 客户端.py:

    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((IP, 8080))
    sock.close()
    

  1. 当 IP = '127.0.0.1'时,它可以工作
  2. 我设置了一个静态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'时,它可以工作

  3. 我在路由器上设置了端口转发:

    > 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 只是不能'不连接)。

最后注意事项:

  • 我关闭了防火墙。
  • 我检查了端口是否打开(http://www.canyouseeme.org/)并且确实如此。
  • 我检查了服务器是否正在监听(netstat -na | find /i "8080"),它确实在监听。

有什么想法有什么问题吗?

4

1 回答 1

1

据我了解,如果我离开服务器 IP '10.0.0.200' 并将客户端 IP 设置为我的公共 IP,它应该可以工作,但它不起作用。

没错,如果客户端在外部网络上。在本地网络上,如果您使用公共地址,它可能会或可能不会工作,具体取决于您的路由器是否实施 NAT 反射(如果没有,它将丢弃数据包)。您应该使用本地网络上的本地(私有)IP 地址。许多路由器允许您为本地资源配置 DNS 记录(覆盖来自 DNS 服务器的记录,实现一种“拆分 DNS”)。这样您就可以使用一个 DNS 名称来获取正确的地址。

如果您的问题是来自外部网络上的客户端的连接,那么听起来您的 NAT 路由器不是端口转发。我没有你的路由器型号,但我看到这条线:

来自内部主机 IP 地址:ALL

并想知道您是否必须允许From External.

您还确定启用了此规则吗?(我只是问,因为我上次遇到这样的问题时,我已经正确创建了转发规则,但它没有启用。)

如果您仍然卡住,请尝试删除规则并重新测试端口是否对http://www.canyouseeme.org/开放。我还会在不运行您的服务器程序时重新测试(以测试外部端口扫描是否具有误导性,这可能会发生)。

最后,当你写:

我关闭了防火墙。

你是说Windows防火墙吗?您还需要仔细检查,因为 Windows 防火墙可以允许本地连接同时阻止远程连接。

于 2013-02-16T17:49:35.667 回答