Como depurar redes linux: Endereço já em uso

10

Eu tenho uma caixa Linux Slackware onde não consigo iniciar nenhum serviço que escute em uma porta específica no host local. Usando strace, descobri que o erro ocorre na bind()chamada e o erro é 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)

Isso acontece com qualquer processo que tento começar a ouvir nessa porta, portanto não está relacionado ao processo em si. A saída de strace acima vem o comando strace -ff nc -l -p 874 -s 127.0.0.1.

Portanto, isso sugere que já existe um processo na porta 874 do host local. No entanto, não consigo encontrá-lo. Os seguintes comandos não retornam 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

Se eu tentar ouvir, 0.0.0.0:874ele falha com o mesmo erro. Ouvir um dos endereços IP configurados em um nic funciona bem, e ouvir 127.0.0.2:874também funciona bem. Ouvir em uma porta diferente funciona bem, também em 127.0.0.1ou 0.0.0.0.

Então, agora estou curioso. Como posso descobrir por que a pilha de rede retorna EADDRINUSE aqui? Que outras coisas eu poderia olhar ou que outros comandos posso executar para obter mais informações?

Informação adicional:

  • Kernel 4.1.31.
  • O Selinux não é usado aqui.
  • Tentando se conectar ao 127.0.0.1 com telnet retorna "Conexão recusada"
  • Estou executando os comandos como root
roelvanmeer
fonte
1
A porta é mencionada em algum lugar na iptables -Ssaída?
Htitu # 24/16
1
Você também pode imprimir a saída do strace -ff nc -l 874 também, O que você usou está tentando fazer conexões com o 874 como porta de origem. Obrigado!
Anirudh Malhotra 25/10
2
O AFAIK Linux requer privilégios de root ao ouvir uma porta <1000. Talvez esse seja o problema aqui.
Koraktor 25/10/16
2
Este host é um cliente NFS? Pode estar usando a porta de origem 874 para uma montagem NFS. Enfim, eu tentaria netstat -na | grep 874caso suas netstatbandeiras atuais fossem muito restritivas.
Tom Shaw
1
@ TomShaw Você acabou de fazer o meu dia! Estava tudo bem com o NFS . Não sei ao certo como isso aconteceu, mas depois de desmontar todas as montagens NFS e reiniciar os serviços RPC e NFS, o problema desapareceu. Com o tcpdump, também vi algum tráfego da porta 874 para a porta 111 (por que não pensei nisso antes), o que o confirma. Você pode postar isso como uma resposta, por favor?
roelvanmeer

Respostas:

4

Se o seu host for um cliente NFS, ele poderá estar usando a porta de origem 874 para uma montagem NFS. Eu suspeito que, porque a conexão não se origina do espaço do usuário, ela pode não estar visível para as ferramentas que você usou até o momento.

Considere um dos seguintes:

  • Ajuste o sysctls sunrpc.min_resvporte sunrpc.max_resvport(default 665 e 1023) para alterar o intervalo de portas de origem que usa o cliente NFS
  • Use uma porta de escuta fora deste intervalo
  • Use a noresvportopção na montagem NFS para usar o intervalo não privilegiado (pode ter implicações de segurança)
Tom Shaw
fonte