我最近在路由器上设置了端口转发,以便它将端口的传入流量转发48888
到我的笔记本电脑:
我已经为我的笔记本电脑设置了静态 DCHP,以便它始终具有相同的本地 IP,即192.168.0.35
。从现在开始,我将使用80.222.77.111
来指代我的公共 IP(尽管它不完全是这个),即路由器的公共 IP。
为了检查它是否正常工作,我开始使用以下命令监听这台笔记本电脑上的传入流量netcat
:
nc -kl 48888
(使用nc
Cygwin 上的软件包)。然后我在手机上启动了移动热点,并将第二台笔记本电脑连接到该热点;然后,我打开了一个终端并再次使用 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 阻止了您的请求,要么是防病毒软件阻止了它。因此,为了进行测试,请尝试禁用它或将其添加到例外列表中,这应该可以帮助您确认问题所在。一旦您知道原因,您就可以让它正常工作。