我在开放网络端口时遇到了一种奇怪的情况。我的主要问题是,为什么没有与开放 TCP 端口关联的程序:
netstat -ln --program
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN -
就我的情况而言,应该有一个 nrpe 守护进程 (opsview install) 监听端口 5666,但没有 nrpe 守护进程在运行。如果我尝试启动它,它会立即退出。
lsof -i :5666
也没有显示任何输出。我的系统上没有运行 (x)inetd。
更新
是的,我以 root 身份运行这些命令。Telnet 可以,但没有任何响应。
经过进一步调查,我发现了一个内核错误dmesg
:这是一个运行较旧内核(2.6.16 显然不稳定)的 EC2 实例(实际上是其中的几个)。阻止崩溃的修复方法是升级内核。
看起来内核崩溃的方式导致进程消失并且端口保持打开状态。
答案1
内核打开的端口不会与程序名称一起显示。我想到了一些 NFS 和 OCFS 的东西。也许是类似的东西?
或者可能是内核错误。检查内核日志以查找 OOPS 和 BUG。
答案2
您是否以 root 身份或使用 sudo 运行过 netstat 和 lsof?请注意最后一列:
netstat -ln --program
tcp 0 0 192.168.21.1:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
sudo netstat -ln --program
tcp 0 0 192.168.21.1:53 0.0.0.0:* LISTEN 2566/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2566/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3125/sshd
来自 netstat 手册页:
您还需要超级用户权限才能查看您不拥有的套接字上的此信息。
您怎么知道没有正在运行的程序?如果端口正在使用中,则它会立即退出并出现“套接字正在使用”错误,这是有道理的。当您 telnet 到端口时会发生什么?
telnet localhost 5666
答案3
执行'netstat --tcp --udp --listening --program' 作为root 用户否则你不会得到PID/程序名称
然后使用 kill -9 PID 命令
答案4
我能够通过 netstat 获取进程的 inode,然后使用 lsof 来跟踪该进程。请参阅我在https://serverfault.com/a/847910/94376。