如何debuggingLinuxnetworking:地址已经在使用中

我有一个Slackware linux框,我无法启动任何监听本地主机上的一个特定端口的服务。 通过使用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.但是,我似乎无法find它。 以下命令都不返回任何内容:

 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上configuration的IP地址之一工作正常,并且监听127.0.0.2:874也可以正常工作。 在不同的端口上听function也很好,同样在127.0.0.10.0.0.0

所以,现在我好奇。 我怎么知道为什么networking堆栈在这里返回EADDRINUSE? 还有什么其他的东西可以看,或者我可以运行哪些其他的命令来获得更多的信息?

附加信息:

  • 内核4.1.31。
  • Selinux不在这里使用。
  • 试图用telnet连接到127.0.0.1返回“连接被拒绝”
  • 我以root身份运行这些命令

如果您的主机是NFS客户端,则可能使用源端口874进行NFS挂载。 我怀疑,因为连接不是来自用户空间,它可能不会看到你迄今使用的工具。

考虑下列之一:

  • 调整sysctlsunrpc.min_resvportsunrpc.max_resvport (默认sunrpc.max_resvport 665和1023),以更改NFS客户端使用的源端口的范围
  • 使用此范围之外的侦听端口
  • 使用NFS挂载上的noresvport选项来使用非特权范围(可能有安全隐患)