Cómo depurar redes Linux: dirección ya en uso

10

Tengo un cuadro de Slackware Linux donde no puedo iniciar ningún servicio que escuche en un puerto en particular en localhost. Al usar strace descubrí que el error ocurre en la bind()llamada y el error es 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)

Esto sucede con cualquier proceso que intento comenzar a escuchar en ese puerto, por lo que no está relacionado con el proceso en sí. La salida de strace anterior proviene del comando strace -ff nc -l -p 874 -s 127.0.0.1.

Entonces, esto sugiere que hay un proceso que ya está escuchando en el puerto localhost 874. Sin embargo, parece que no puedo encontrarlo. Los siguientes comandos no devuelven nada:

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

Si trato de escucharlo 0.0.0.0:874, falla con el mismo error. Escuchar en una de las direcciones IP configuradas en un nic funciona bien, y escuchar 127.0.0.2:874también funciona bien. Escuchar en un puerto diferente funciona bien, también en 127.0.0.1o 0.0.0.0.

Entonces, ahora tengo curiosidad. ¿Cómo puedo averiguar por qué la pila de red devuelve EADDRINUSE aquí? ¿Qué otras cosas podría mirar o qué otros comandos puedo ejecutar para obtener más información?

Información adicional:

  • Kernel 4.1.31.
  • Selinux no se usa aquí.
  • Intentar conectarse a 127.0.0.1 con telnet devuelve "Conexión rechazada"
  • Estoy ejecutando los comandos como root
Roelvanmeer
fuente
1
¿Se menciona el puerto en algún lugar de la iptables -Ssalida?
hertitu
1
¿Puede imprimir también la salida de strace -ff nc -l 874 también? La que usó está tratando de hacer conexiones con 874 como puerto de origen. ¡Gracias!
Anirudh Malhotra
2
AFAIK Linux requiere privilegios de root cuando se escucha un puerto <1000. Tal vez ese sea el problema aquí.
Koraktor
2
¿Es este host un cliente NFS? Puede estar utilizando el puerto fuente 874 para un montaje NFS. De todos modos, lo intentaría netstat -na | grep 874en caso de que sus netstatbanderas actuales sean demasiado restrictivas.
Tom Shaw
1
@ TomShaw ¡Acabas de alegrarme el día! Fue NFS bien. No estoy seguro de cómo ocurrió exactamente esto, pero después de desmontar todos los montajes NFS y reiniciar los servicios RPC y NFS, el problema desapareció. Con tcpdump también vi algo de tráfico desde el puerto 874 al puerto 111 (¿por qué no pensé en eso antes?), Lo que lo confirma. ¿Puedes publicar esto como respuesta por favor?
roelvanmeer

Respuestas:

4

Si su host es un cliente NFS, puede estar usando el puerto fuente 874 para un montaje NFS. Sospecho que debido a que la conexión no se origina en el espacio de usuario, es posible que no sea visible para las herramientas que ha utilizado hasta ahora.

Considere uno de los siguientes:

  • Ajustar la sysctls sunrpc.min_resvporty sunrpc.max_resvport(por defecto 665 y 1023) para cambiar el rango de puertos de origen que utiliza el cliente de NFS
  • Use un puerto de escucha fuera de este rango
  • Use la noresvportopción en el montaje NFS para usar el rango no privilegiado (puede tener implicaciones de seguridad)
Tom Shaw
fuente