Netcat 无法绑定侦听套接字

log*_*off 9 netcat socket

在装有 Ubuntu 14.04 的计算机中,我可以执行以下操作:

$ nc -l 5349 -vvv
Listening on [0.0.0.0] (family 0, port 5349)
Run Code Online (Sandbox Code Playgroud)

或这个:

$ nc -vvv -l 192.168.254.96 5349
Listening on [192.168.254.96] (family 0, port 5349)
Run Code Online (Sandbox Code Playgroud)

并打开一个套接字以侦听我本地 IP 地址 (192.168.254.96) 上的输入连接。显然我可以从另一端连接并传输数据。

但是在带有 Debian 8.0 Jessie 的 NAT 后面的服务器中,我收到了这个奇怪的错误:

$ nc -vvv -l 5349
5349: inverse host lookup failed: Unknown host
nnetfd reuseport failed : Protocol not available
listening on [any] 38541 ... : Protocol not available
Run Code Online (Sandbox Code Playgroud)

或者:

$ nc -vvv -l 10.1.6.189 5349
10.1.6.189: inverse host lookup failed: Unknown host
nnetfd reuseport failed : Protocol not available
listening on [any] 52606 ... : Protocol not available
Run Code Online (Sandbox Code Playgroud)

端口未使用:

$ ss -tnl | grep 5349
(empty)
Run Code Online (Sandbox Code Playgroud)

它是正确的 IP 地址:

$ ip addr list
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 1e:89:93:f1:96:a4 brd ff:ff:ff:ff:ff:ff
    inet 10.1.6.189/19 brd 10.1.31.255 scope global eth0
    inet6 fe80::1c89:93ff:fef1:96a4/64 scope link 
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?可能与服务器背后的NAT有关吗?

Duk*_*ion 8

对于处于侦听模式的 netcat,您应该使用-p标志来选择侦听端口,例如nc -vvv -l -p 5349.

第二个错误:nnetfd reuseport failed : Protocol not available 与 SO_REUSEPORT 套接字选项有关。它是在 linux 内核版本 3.9 中引入的,使用它的 netcat 版本不适用于较早的内核版本。您可以将内核升级到更新的版本,也可以使用 netcat 的另一种变体。我相信 netcat-openbsd 应该可以工作。