roe*_*eer 10 networking linux-networking
我有一个 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.
所以,这表明有一个进程已经在侦听本地主机端口 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
Run Code Online (Sandbox Code Playgroud)
如果我尝试听0.0.0.0:874它会失败并出现相同的错误。侦听在 nic 上配置的 IP 地址之一可以正常工作,并且侦听127.0.0.2:874也可以正常工作。侦听不同的端口工作正常,也在127.0.0.1或 上0.0.0.0。
所以,现在我很好奇。我怎样才能找出网络堆栈在这里返回 EADDRINUSE 的原因?我还可以查看哪些其他内容,或者我可以运行哪些其他命令来获取更多信息?
附加信息:
如果您的主机是 NFS 客户端,则它可能使用源端口 874 进行 NFS 挂载。我怀疑,由于连接不是源自用户空间,因此您迄今为止使用的工具可能无法看到该连接。
考虑以下其中一项:
sysctlssunrpc.min_resvport和sunrpc.max_resvport(默认 665 和 1023)以更改 NFS 客户端使用的源端口范围noresvportNFS 挂载上的选项来使用非特权范围(可能会产生安全隐患)