如何调试Linux网络:地址已在使用中


10

我有一个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。但是,我似乎找不到它。以下命令均不返回任何内容:

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地址之一上侦听可以,并且侦听127.0.0.2:874也可以。在127.0.0.1或上,在其他端口上监听也可以0.0.0.0

所以,现在我很好奇。我如何找出为什么网络堆栈在这里返回EADDRINUSE?我还可以查看其他什么内容,或者可以运行哪些其他命令来获取更多信息?

附加信息:

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

1
iptables -S输出中的任何地方都提到了端口吗?
hertitu

1
您还可以打印strace -ff nc -l 874的输出吗?您使用的那个试图将874作为源端口进行连接。谢谢!
阿尼鲁德·马尔霍特拉

2
AFAIK Linux在侦听<1000端口时需要root特权。也许这就是问题所在。
Koraktor '16

2
该主机是NFS客户端吗?它可能正在使用源端口874进行NFS安装。无论如何,我会尝试netstat -na | grep 874以防您当前的netstat标志过于严格。
汤姆·萧

1
@TomShaw你刚刚过了我的一天!这是NFS没事。我不确定这是怎么发生的,但是在卸载所有NFS挂载并重新启动RPC和NFS服务之后,问题就消失了。使用tcpdump时,我还看到从端口874到端口111的一些流量(为什么我以前没有想到),这可以确认这一点。你能把这个作为答案发表吗?
roelvanmeer

Answers:


4

如果主机是NFS客户端,则它可能正在使用源端口874进行NFS挂载。我怀疑由于连接不是源自用户空间,因此到目前为止您使用的工具可能看不到该连接。

请考虑以下之一:

  • 调整sysctls sunrpc.min_resvportsunrpc.max_resvport(默认值665和1023)以更改NFS客户端使用的源端口的范围
  • 使用此范围之外的侦听端口
  • 使用noresvportNFS挂载上的选项以使用非特权范围(可能会带来安全隐患)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.