SlackwareのLinuxボックスを使用していますが、localhostの特定のポートでリッスンするサービスを開始できません。 straceを使用して、エラーがbind()
の呼び出しで発生し、エラーがEADDRINUSE (Address already in use)
であることがわかりました。
bind(3, {sa_family=AF_INET, sin_port=htons(874), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EADDRINUSE (Address already in use)
これは、そのポートでリッスンを開始しようとするプロセスで発生するため、プロセス自体とは関係ありません。上記のstrace出力は、コマンドstrace -ff nc -l -p 874 -s 127.0.0.1
からのものです。
したがって、これはlocalhostポート874ですでにリッスンしているプロセスがあることを示唆しています。しかし、それを見つけることができないようです。次のコマンドはすべて何も返しません。
netstat -aplunt | grep :874
netstat -na | grep :874
lsof -i :874
lsof -i tcp | grep 874
fuser 874/tcp
socklist | grep 874
iptables -t filter -S | grep 874
iptables -t nat -S | grep 874
iptables -t mangle -S | grep 874
conntrack -L | grep 874
0.0.0.0:874
をリッスンしようとすると、同じエラーで失敗します。 nicで構成されたIPアドレスの1つをリッスンすることは正常に機能し、127.0.0.2:874
をリッスンすることも正常に機能します。別のポートでのリスニングは、127.0.0.1
または0.0.0.0
でも正常に機能します。
それで、今、私は興味があります。ネットワークスタックがここでEADDRINUSEを返す理由を確認するにはどうすればよいですか?他に何を見ることができますか、または他のどのコマンドを実行して詳細情報を取得できますか?
追加情報:
ホストがNFSクライアントの場合、NFSマウントにソースポート874を使用している可能性があります。接続はユーザー空間からのものではないため、これまでに使用したツールからは見えない可能性があると思います。
次のいずれかを検討してください。
sysctl
s sunrpc.min_resvport
およびsunrpc.max_resvport
(デフォルトは665および1023)を調整して、NFSクライアントが使用するソースポートの範囲を変更します。noresvport
オプションを使用して、非特権範囲を使用します(セキュリティに影響する可能性があります)