web-dev-qa-db-ja.com

Linuxネットワークをデバッグする方法:アドレスはすでに使用されています

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を返す理由を確認するにはどうすればよいですか?他に何を見ることができますか、または他のどのコマンドを実行して詳細情報を取得できますか?

追加情報:

  • カーネル4.1.31。
  • ここではSelinuxは使用されません。
  • Telnetで127.0.0.1に接続しようとすると、「接続が拒否されました」が返される
  • Rootとしてコマンドを実行しています
10
roelvanmeer

ホストがNFSクライアントの場合、NFSマウントにソースポート874を使用している可能性があります。接続はユーザー空間からのものではないため、これまでに使用したツールからは見えない可能性があると思います。

次のいずれかを検討してください。

  • sysctls sunrpc.min_resvportおよびsunrpc.max_resvport(デフォルトは665および1023)を調整して、NFSクライアントが使用するソースポートの範囲を変更します。
  • この範囲外のリスニングポートを使用してください
  • NFSマウントでnoresvportオプションを使用して、非特権範囲を使用します(セキュリティに影響する可能性があります)
4
Tom Shaw