Linux 下如何查看指定进程发起的所有连接信息

定位某个进程的网络故障时经常需要用到的一个功能就是查找所有连接的信息,通常查找某个端口的连接信息使用 ss 或者 netstat,如果是主动与其他服务器建立的连接信息则可以通过 lsof 命令查看。

一、指定进程连接
例如想要查看进程 frps 当前的所有连接信息,则先获得进程的 pid:

# ps -ef|grep frps
root 4721 1 0 10:27 ? 00:00:01 ./frps

可以看到进程 pid 为 4721,然后通过 lsof 命令查看所有 TCP 连接信息:

# lsof -p 4721 -nP | grep TCP
frps 4721 root 4u IPv4 117051764 0t0 TCP *:7000 (LISTEN)
frps 4721 root 6u IPv4 117051765 0t0 TCP *:7003 (LISTEN)
frps 4721 root 7u IPv4 117092563 0t0 TCP 139.129.11.120:7000->116.231.70.223:61545 (ESTABLISHED)
frps 4721 root 8u IPv4 117092565 0t0 TCP *:6000 (LISTEN)
frps 4721 root 9u IPv4 117334426 0t0 TCP 139.129.11.120:7000->116.237.93.230:64898 (ESTABLISHED)
frps 4721 root 10u IPv4 117053538 0t0 TCP 139.129.11.120:7000->115.231.20.123:41297 (ESTABLISHED)
frps 4721 root 11u IPv4 117053540 0t0 TCP *:6005 (LISTEN)
frps 4721 root 12u IPv4 117334428 0t0 TCP *:6004 (LISTEN)

从 lsof 的输出结果中可以清楚的看到 frps 进程监听了 5 个端口,并且在 7000 端口上建立了 3 个连接,连接两端的 ip 信息也都可以查到。

lsof 的 -nP 参数用于将 ip 地址和端口号显示为正常的数值类型,否则可能会用别名显示。

如果提示

# lsof -p 4721 -nP | grep TCP
-bash: lsof: command not found

那么安装下 lsof 即可(一般出现在 CentOS):

# yum install lsof -y

二、指定端口连接
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等,功能强大。

常见参数:

-a (all)显示所有选项,默认不显示 LISTEN 相关
-t (tcp)仅显示 tcp 相关选项
-u (udp)仅显示 udp 相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如 uid 等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该 netstat 命令。
提示:LISTEN 和LISTENING 的状态只有用 -a 或者 -l 才能看到

常用命令组合如下:

# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1161/sshd
tcp 0 0 0.0.0.0:666 0.0.0.0:* LISTEN 1159/shellinaboxd
tcp 0 0 10.2.0.205:47134 104.18.38.114:443 ESTABLISHED 1173/python
tcp 0 0 10.2.0.205:46888 104.18.38.114:443 ESTABLISHED 1173/python
tcp 0 248 10.2.0.205:22 10.2.2.132:49339 ESTABLISHED 32416/sshd: root@pt
tcp 0 0 10.2.0.205:22 10.2.2.132:52139 ESTABLISHED 32118/sshd: root@pt
tcp6 0 0 :::22 :::* LISTEN 1161/sshd

可以看到系统监听了 22 和 666 端口,并与 104.18.38.114 产生了外网连接,也可以看到与 104.18.38.114 产生连接的是 Python,进程 ID 是 1173。

同样的,如果出现

# netstat -antlp
-bash: netstat: command not found

那么安装一下软件包即可(主要出现在 CentOS7)

# yum install net-tools -y

参考文章:
1、《linux下查看指定进程的所有连接信息》
2、《Linux netstat命令详解》

点赞