Ubuntu 14.04 を搭載した私のコンピューターでは、次のようなことができます。
$ nc -l 5349 -vvv
Listening on [0.0.0.0] (family 0, port 5349)
またはこれ:
$ nc -vvv -l 192.168.254.96 5349
Listening on [192.168.254.96] (family 0, port 5349)
そして、ローカル 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
または:
$ 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
ポートは使用されていません:
$ ss -tnl | grep 5349
(empty)
正しい 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
何が問題なのでしょうか? サーバーの背後にある NAT に関連する何かがあるのでしょうか?
答え1
listen モードの netcat では、-p
フラグを使用して listen ポートを選択する必要があります (例: ) nc -vvv -l -p 5349
。
2 番目のエラー:nnetfd reuseport failed : Protocol not available
は SO_REUSEPORT ソケット オプションに関連しています。これは Linux カーネル バージョン 3.9 で導入されたもので、これを使用する netcat バージョンは以前のカーネル リリースでは動作しません。カーネルを最新バージョンにアップグレードするか、netcat の別のバリエーションを使用することができます。netcat-openbsd が動作するはずです。