我有 ubuntu/hardy 服务器,内核为 2.6.24-23-server,netstat 为:
# netstat --version
net-tools 1.60
netstat 1.42 (2001-04-15)
问题是我们有很多已建立的连接,但netstat -ntap
输出中没有显示 PID 或程序名称。Netstat 是从 root 调用的,没有 chroot、grsecurity,也没有类似的东西(至少有人告诉我 :)。
知道可能出了什么问题吗?
更新
lsof -n -i
工作正常,并显示连接的 pid/进程名称。
答案1
198_141:~ # netstat -anp|grep 33000
tcp 0 0 0.0.0.0:53000 0.0.0.0:* LISTEN -
198_141:~ # lsof -i:33000
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
vsftpd 28147 root 3u IPv4 4089990174 TCP *:33000 (LISTEN)
198_141:~ # id
uid=0(root) gid=100(users) groups=16(dialout),100(users)
198_141:~ #
我认为可能有两种情况:
1)普通权限用户执行“netstat”无法看到由root启动的进程
2)一些进程在内核中运行
答案2
这将发生在像 NFS 这样的内核进程中,但偶尔也会发生在常规应用程序中:RHEL 5 具有相同的行为。
# netstat -taupen | grep 30715
tcp 0 0 0.0.0.0:30715 0.0.0.0:* LISTEN 66558 81467710 -
另一方面,请注意 lsof 的措辞正确:
# lsof -i:30715
AppName 1598 useracct 78u IPv4 81467710 TCP *:30715 (LISTEN)
答案3
对于已建立的连接,这种情况只发生在从内核空间发起的连接(如 NFS 或 DRBD)中。显然,等待的连接可能会导致其下的进程死亡。如果您无法确定导致给定连接的原因,请粘贴输出,有人会告诉您它是什么。
答案4
来到这里是因为最近我在 ubuntu 18.04 LTS 上遇到了同样的问题(netstat 是同一个版本 netstat 1.42 (2001-04-15)),奇怪的是 8 年后仍然没有答案。浏览 net-tools 的源代码后,我可能会找到它。
在netstat源代码中:
迭代 /proc 中的所有进程文件夹,检查 /proc//fd 目录中的每个 fd 以构建从套接字 inode 到 pid/progname 的映射。
然后检查 /proc/net/tcp 以获取 tcp 套接字信息(通过 tcp_info 函数),包括套接字 inode。
输出 tcp 套接字信息时,通过套接字 inode 从步骤 1 中的映射中查询 pid/progname。如果没有找到,则输出‘-’。
如果在构建映射之后创建套接字,则在映射中找不到 pid/progname。