我有一个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身份运行命令
您还可以打印strace -ff nc -l 874的输出吗?您使用的那个试图将874作为源端口进行连接。谢谢!
—
阿尼鲁德·马尔霍特拉
AFAIK Linux在侦听<1000端口时需要root特权。也许这就是问题所在。
—
Koraktor '16
该主机是NFS客户端吗?它可能正在使用源端口874进行NFS安装。无论如何,我会尝试
—
汤姆·萧
netstat -na | grep 874
以防您当前的netstat
标志过于严格。
@TomShaw你刚刚过了我的一天!这是NFS没事。我不确定这是怎么发生的,但是在卸载所有NFS挂载并重新启动RPC和NFS服务之后,问题就消失了。使用tcpdump时,我还看到从端口874到端口111的一些流量(为什么我以前没有想到),这可以确认这一点。你能把这个作为答案发表吗?
—
roelvanmeer
iptables -S
输出中的任何地方都提到了端口吗?