我想弄清楚在一段时间内哪些进程正在与哪些网站进行通信。我发现的所有程序(例如 ss)都会列出此时打开然后退出的连接。
实际上,我想要的是像wireshark这样的东西,但它会记录进程名称。
真的没有这样的程序吗?
答案1
如果您有最新的内核(最好至少是 4.9,但显然有些功能可以在 4.2 上运行),那么您可以利用新的内核跟踪该工具允许您拦截connect()
内核中的每个 tcp 调用并显示进程 ID、远程 IP 地址和端口。
由于这不会轮询,因此您不会错过任何短暂的连接。来自布伦丹·格雷格博客2016 年的典型产量是
# tcpconnect
PID COMM IP SADDR DADDR DPORT
1479 telnet 4 127.0.0.1 127.0.0.1 23
1469 curl 4 10.201.219.236 54.245.105.25 80
1469 curl 4 10.201.219.236 54.67.101.145 80
1991 telnet 6 ::1 ::1 23
2015 ssh 6 fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22
答案2
您可以用来netstat
显示 tcp/ip 流量以及 PID 和进程名称,如下所示:
netstat -pt
要观看现场直播,请使用watch -n
一定的间隔,如下所示:
watch -n 2 netstat -pt
要随着时间的推移收集此类信息,您可以将其保存为 bash 脚本并运行:
sec=1
count=0
end=3600
echo > output.txt
while [ $count -lt $end ]; do
netstat -pt | sed -e '1,2d' >> output.txt
sleep $sec
count=$((count+1))
done
这将netstat -pt
每秒运行一个小时,并将结果直接存入output.txt
.然后你可以使用:
awk '{ print $7 "\t" $5 }' output.txt
很好地打印格式化的 PID/process_name 和 website:protocol,为收集的每一行用制表符分隔。
答案3
在tcpdump
看到数据包的网络层,与用户进程的连接不可用。该ss
工具可以选择-p
列出与网络连接关联的进程。由于ss
仅显示某个时间点的信息,因此您必须经常运行它,并且仍然可能丢失有关短连接的信息。
要了解传输的内容,您可以运行tcpdump
并捕获所有内容,稍后您可以过滤捕获的数据包以获取从 获得的本地端口号ss
。
这不会为您提供有关所使用的 DNS 名称的直接信息,因为连接始终指向 IP 地址。但是您可以在网络捕获中搜索使用稍后使用的连接的 IP 地址进行响应的 DNS 请求,这将使您知道所使用的 DNS 名称,除非存在对使用相同 IP 地址的不同 DNS 名称的请求。
如果您确实想知道该进程正在做什么,请使用strace
.您将看到发送到解析器的 DNS 名称以及传输的所有内容,即使是短暂的连接。