如何让netcat接受来自局域网外的连接?

40
我正在使用netcat作为我制作的程序来回传递数据的后端。我在本地网络上测试了我的程序,一旦它工作正常,我以为只需要从路由器转发一个端口就能让我的程序在互联网上运行。但不幸的是,这似乎并非如此。
如果我使用以下命令在6666端口上启动netcat监听: nc -vv -l -p 6666
然后在浏览器中输入127.0.0.1:6666,预期会看到HTTP GET请求通过netcat传输(而我的浏览器会无效地等待)。但是,如果我访问my.external.ip.address:6666,则根本没有传输任何数据,浏览器显示“无法连接到my.external.ip.address:6666”。
我知道端口已经正确转发,因为www.canyouseeme.org指出端口6666是打开的(当netcat没有监听时则关闭)。
如果我使用“-g my.adslmodem's.local.address”选项运行netcat以设置网关地址,则会得到相同的结果。我是否正确使用此命令行选项?请指出我做错了什么。
3个回答

41
你必须监听公共接口。你当前正在监听本地主机,没有人可以在计算机外连接。
你的情况可能有所不同,但是对于我的netcat实现,我必须使用以下命令行来监听所有公共接口。 netcat -vv -l 0.0.0.0 6666

5
谢谢您的回答。我认为这不是问题所在,因为Netcat能够接收来自网络上其他计算机的连接。而且当它启动时会显示“listening on [any] 6666 ...”。我尝试了您的建议(在端口号之前加上“-p”,否则它会选择一个随机端口),但是出现了“0.0.0.0: inverse host lookup failed: Unknown host”的错误信息。 - Chris
也适用于Cygwin(nc) - golimar
太好了 :) 对我来说可行。 - dimba

24

结果并没有问题。看起来只是因为我的路由器不允许发生“头发回捲(hairpin)”连接,也就是说,即使我已经正确设置了,当源和目标都在NAT后面时,路由器会阻止连接。只需使用ncat -l -p 6666就可以正常工作,只要请求来自局域网外部。为了测试这个,我用我的3G手机浏览到my.external.ip.address:6666,确实收到了一个HTTP请求 :)

这个答案来自于一个 serverfault 问题,其实我一开始应该就在那里提出这个问题的。对此我很抱歉。


1
哈哈,没关系。我在SF上问了一个类似的问题,但他们认为这太新手了。我不知道“发夹”连接是什么(人们一直在引用“发夹NAT”并告诉我去读文档),直到我读到这个答案才明白。谢谢。 - isomorphismes
它对我也起作用了。我没有使用0.0.0.0。正如你所说,只需要目标机器上的端口。谢谢! - Dino Velić

14

指定一个监听地址:

nc -l -s <LISTENING_IP_ADDR> -p <LISTENING_PORT>

在Debian Jessie上测试,使用netcat-traditional-1.10-41


2
无法同时使用-l-s - benedikt
3
@benedikt:一些版本的 nc 可以,一些不能。 Debian 上的 nc.traditional 版本可以: nc -l -s 192.168.18.100 -p 6666 而 Ubuntu 上的 /bin/nc.openbsd 版本不行: nc -l -s 192.168.244.163 -p 6666 出现错误提示:nc: cannot use -s and -l - Antonio Bardazzi
感谢澄清。 - benedikt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接