有没有可以通过进程和域名记录网络流量的程序?

有没有可以通过进程和域名记录网络流量的程序?

我想弄清楚在一段时间内哪些进程正在与哪些网站进行通信。我发现的所有程序(例如 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 名称以及传输的所有内容,即使是短暂的连接。

相关内容