显示进程的网络连接

显示进程的网络连接

有没有办法显示进程的连接?像这样的东西:

show PID

其中show是执行此操作的命令,PID是进程的 ID。我想要的输出由进程的所有连接组成(实时)。例如,如果进程尝试连接到173.194.112.151输出是173.194.112.151.

Firefox 的更具体示例:

show `pidof firefox`

对于 Firefox,我首先会去谷歌网站,然后到unix.stackexchange.com最后到192.30.252.129。当我关闭浏览器时,输出必须是:

google.com
stackexchange.com
192.30.252.129

(显然对于浏览器来说这个输出是不现实的,因为还有很多其他相关的连接,但这只是一个例子。)

答案1

您正在寻找strace!我发现这个答案在askubuntu,但它对 Unix 有效:

要启动并监视新进程:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

要监视具有已知 PID 的现有进程:

strace -p $PID -f -e trace=network -s 10000

否则,但这是 Linux 特有的,你可以在隔离的网络命名空间中运行该进程并使用wireshark来监控流量。这可能比阅读strace日志更方便:

  • 创建测试网络命名空间:

    ip netns add test
    
  • 创建一对虚拟网络接口(veth-a 和 veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • 更改 veth-a 接口的活动命名空间:

    ip link set veth-a netns test
    
  • 配置虚拟接口的IP地址:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • 在测试命名空间中配置路由:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • 激活 ip_forward 并建立 NAT 规则来转发来自您创建的命名空间的流量(您必须调整网络接口和 SNAT IP 地址):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (如果您愿意,也可以使用 MASQUERADE 规则)

  • 最后,您可以在新的命名空间中运行要分析的进程,也可以运行wireshark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    您必须监视 veth-a 接口。

答案2

尝试

lsof -i -a -p $(pidof firefox | sed 's/ /,/g')

pidof 手册页:

描述
Pidof 查找指定程序的进程 ID (pid)。
它在标准输出上打印这些 id。

lsof 手册页:

  • -i此选项选择其 Internet 地址与 i 中指定的地址匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。
  • -a
  • -p此选项排除或选择进程的文件列表,其可选过程ID实体 (PID) 编号位于逗号分隔的集合 s 中 - 例如,123123,^456。 (集合中不应有空格。)

为什么sed:当我们有多个与进程名称匹配的进程时,我们希望 PID 列表从pidof到 到lsof,每个 PID 后面都需要逗号,我们必须将空格转换为逗号。我们也可以选择使用tr \ \,
当我们知道我们有具有给定进程名称的 Exactly Single Process 时,我们可以跳过sed& tr

答案3

这是另一种方法:

ss -nap | grep $(pidof firefox)

示例输出:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))

答案4

您也可以尝试使用netstat -p.从手册页:

netstat - 打印网络连接、路由表、接口统计信息、伪装连接和多播成员资格

要仅显示网络连接,请使用netstat -tup.请注意,要查看进程 PID,您可能需要成为 root。

netstat如果您的系统上没有,您可能有ss,它的语法几乎完全相同。然后你就可以使用ss -tup(作为root)。

相关内容