我有一个 Slackware linux 机器,我无法启动任何在 localhost 上的一个特定端口上侦听的服务。通过使用 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 输出来自 command 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
or上也是如此0.0.0.0
。
所以,现在我很好奇。我怎样才能找出为什么网络堆栈在这里返回 EADDRINUSE?我还可以查看哪些其他内容,或者我可以运行哪些其他命令来获取更多信息?
附加信息:
- 内核 4.1.31。
- 这里不使用 Selinux。
- 尝试使用 telnet 连接到 127.0.0.1 返回“连接被拒绝”
- 我以 root 身份运行命令
如果您的主机是 NFS 客户端,它可能使用源端口 874 进行 NFS 挂载。我怀疑由于连接不是来自用户空间,因此您迄今为止使用的工具可能看不到它。
考虑以下其中一项:
sysctl
ssunrpc.min_resvport
和sunrpc.max_resvport
(默认 665 和 1023)以更改 NFS 客户端使用的源端口范围noresvport
NFS 挂载上的选项来使用非特权范围(可能有安全隐患)