So debuggen Sie Linux-Netzwerke: Adresse wird bereits verwendet

10

Ich habe eine Slackware-Linux-Box, in der ich keinen Dienst starten kann, der einen bestimmten Port auf localhost überwacht. Durch die Verwendung von strace habe ich herausgefunden, dass der Fehler beim bind()Aufruf auftritt und der Fehler ist 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)

Dies geschieht bei jedem Prozess, bei dem ich versuche, diesen Port abzuhören, sodass er nicht mit dem Prozess selbst zusammenhängt. Die obige Strace-Ausgabe stammt vom Befehl strace -ff nc -l -p 874 -s 127.0.0.1.

Dies deutet darauf hin, dass auf localhost port 874 bereits ein Prozess abhört. Ich kann ihn jedoch nicht finden. Die folgenden Befehle geben alle nichts zurück:

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

Wenn ich versuche zuzuhören 0.0.0.0:874, schlägt dies mit demselben Fehler fehl. Das Abhören einer der auf einem Netzwerk konfigurierten IP-Adressen funktioniert einwandfrei, und das Abhören 127.0.0.2:874funktioniert ebenfalls einwandfrei. Das Abhören an einem anderen Port funktioniert einwandfrei, auch an 127.0.0.1oder 0.0.0.0.

Also jetzt bin ich neugierig. Wie kann ich hier herausfinden, warum der Netzwerkstapel EADDRINUSE zurückgibt? Welche anderen Dinge könnte ich mir ansehen oder welche anderen Befehle kann ich ausführen, um weitere Informationen zu erhalten?

Zusätzliche Information:

  • Kernel 4.1.31.
  • Selinux wird hier nicht verwendet.
  • Beim Versuch, mit Telnet eine Verbindung zu 127.0.0.1 herzustellen, wird "Verbindung abgelehnt" zurückgegeben.
  • Ich führe die Befehle als root aus
Roelvanmeer
quelle
1
Wird der Port irgendwo in der iptables -SAusgabe erwähnt?
Hertitu
1
Können Sie bitte auch die Ausgabe von strace -ff nc -l 874 drucken? Die von Ihnen verwendete versucht, Verbindungen mit 874 als Quellport herzustellen. Vielen Dank!
Anirudh Malhotra
2
AFAIK Linux benötigt Root-Rechte, wenn ein Port <1000 abgehört wird. Vielleicht ist das hier das Problem.
Koraktor
2
Ist dieser Host ein NFS-Client? Möglicherweise wird der Quellport 874 für eine NFS-Bereitstellung verwendet. Auf jeden netstat -na | grep 874Fall würde ich es versuchen, falls Ihre aktuellen netstatFlags zu restriktiv sind.
Tom Shaw
1
@ TomShaw Du hast gerade meinen Tag gemacht! Es war NFS in Ordnung. Ich bin nicht sicher, wie dies genau zustande gekommen ist, aber nach dem Aufheben der Bereitstellung aller NFS-Bereitstellungen und dem Neustart der RPC- und NFS-Dienste ist das Problem behoben. Mit tcpdump habe ich auch etwas Verkehr von Port 874 zu Port 111 gesehen (warum habe ich vorher nicht daran gedacht), was dies bestätigt. Können Sie dies bitte als Antwort posten?
Roelvanmeer

Antworten:

4

Wenn Ihr Host ein NFS-Client ist, verwendet er möglicherweise den Quellport 874 für einen NFS-Mount. Ich vermute, dass die Verbindung, da sie nicht aus dem Benutzerbereich stammt, für die bisher verwendeten Tools möglicherweise nicht sichtbar ist.

Betrachten Sie eine der folgenden Möglichkeiten:

  • Passen Sie sysctls sunrpc.min_resvportund sunrpc.max_resvport(Standard 665 und 1023) an, um den Bereich der vom NFS-Client verwendeten Quellports zu ändern
  • Verwenden Sie einen Abhöranschluss außerhalb dieses Bereichs
  • Verwenden Sie die noresvportOption auf dem NFS-Mount, um den nicht privilegierten Bereich zu verwenden (kann Auswirkungen auf die Sicherheit haben).
Tom Shaw
quelle