无法从同一本地网络中的其他机器连接到我的公共 IP

无法从同一本地网络中的其他机器连接到我的公共 IP

我最近在路由器上设置了端口转发,以便它将端口的传入流量转发48888到我的笔记本电脑:

端口映射

我已经为我的笔记本电脑设置了静态 DCHP,以便它始终具有相同的本地 IP,即192.168.0.35。从现在开始,我将使用80.222.77.111来指代我的公共 IP(尽管它不完全是这个),即路由器的公共 IP。

为了检查它是否正常工作,我开始使用以下命令监听这台笔记本电脑上的传入流量netcat

nc -kl 48888

(使用ncCygwin 上的软件包)。然后我在手机上启动了移动热点,并将第二台笔记本电脑连接到该热点;然后,我打开了一个终端并再次使用 netcat 通过公共 IP 连接到主机:

nc 80.222.77.111 48888

连接成功,我可以来回发送消息。

但是,当两台计算机都连接到同一个本地网络(具体来说,通过 WiFi 连接到同一个路由器)时,这种方法不起作用。nc -kl 48888在主机上启动后,nc 80.222.77.111 48888在另一台机器上运行只会挂起几秒钟,然后返回,没有任何输出。经检查,退出代码似乎是1。同样,在客户端机器上运行以下 python 脚本

import socket


HOST = "80.222.77.111"
PORT = 48_888

with socket.socket() as s:
    print(f"Trying to connect to {HOST}:{PORT} ...")
    s.connect((HOST, PORT))
    print("Successfully connected")
    while True:
        msg = s.recv(1024)
        if not msg: break
        print("From server:", msg)
        msg = input("Client, enter message: ")
        if not msg: break
        s.send(bytes(msg + "\n", encoding="ASCII"))

结果是

Trying to connect to 80.222.77.111:48888 ...
Traceback (most recent call last):
  File "client.py", line 14, in <module>
    s.connect((HOST, PORT))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

这很奇怪,为什么我可以从外部连接,但不能从内部连接?

此外,我还尝试从同一网络直接连接到本地 IP,即

nc 192.168.0.35 48888

做过工作。

答案1

您正在尝试创建环回连接,如下所示:

local -> router -> internet > router > local

大多数消费者路由器仅实现请求-应答算法,并未编程处理应答实际上是另一个请求的情况。这意味着它实现的是“请求-应答”而不是“请求-请求-应答-应答”。

某些路由器会阻止环回连接,这是一项安全功能。大多数消费级路由器对此没有任何禁止,只是不起作用。

您可以登录路由器的管理页面,查找有关允许环回连接(或类似连接)的任何信息。如果找不到任何信息,则说明路由器不合适。刷新更高级的固件(例如 DD-WRT)可能会有所帮助(但这是一个冒险的操作)。

答案2

看起来要么是 Windows Defender 阻止了您的请求,要么是防病毒软件阻止了它。因此,为了进行测试,请尝试禁用它或将其添加到例外列表中,这应该可以帮助您确认问题所在。一旦您知道原因,您就可以让它正常工作。

相关内容