我有一个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?我还可以查看哪些其他内容,或者可以运行哪些其他命令来获取更多信息?
更多信息:
发布于 2016-10-26 06:51:02
如果您的主机是NFS客户端,它可能使用源端口874进行NFS安装。我怀疑,因为连接不是来自用户空间,所以到目前为止您使用的工具可能看不到它。
考虑以下几点之一:
sysctls sunrpc.min_resvport和sunrpc.max_resvport (默认为665和1023)以更改NFS客户端使用的源端口的范围noresvport选项来使用非特权范围(可能对安全有影响)https://serverfault.com/questions/810841
复制相似问题