netstat -ntap 没有显示某些连接的 pid/进程名称?

netstat -ntap 没有显示某些连接的 pid/进程名称?

我有 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源代码中:

  1. 迭代 /proc 中的所有进程文件夹,检查 /proc//fd 目录中的每个 fd 以构建从套接字 inode 到 pid/progname 的映射。

  2. 然后检查 /proc/net/tcp 以获取 tcp 套接字信息(通过 tcp_info 函数),包括套接字 inode。

  3. 输出 tcp 套接字信息时,通过套接字 inode 从步骤 1 中的映射中查询 pid/progname。如果没有找到,则输出‘-’。

如果在构建映射之后创建套接字,则在映射中找不到 pid/progname。

相关内容