显示进程的网络连接


25

有没有办法显示一个流程的联系?像这样:

show PID

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

Firefox的一个更具体的示例:

show `pidof firefox`

使用firefox,我首先去google.com,然后去unix.stackexchange.com,最后去192.30.252.129。当我关闭浏览器时,输出必须是:

google.com
stackexchange.com
192.30.252.129

(显然,对于浏览器,此输出是不现实的,因为还有很多其他相关的连接,但这仅是示例。)


在哪个Unix变体下?大多数都具有执行此操作的工具,但不同。
吉尔(Gilles)'所以

所以从本质上讲,您需要所有连接的日志吗?
Sergiy Kolodyazhnyy,2015年

我认为tcpdump或Wireshark应该可以完成这项工作。
Sergiy Kolodyazhnyy 2015年

一些可能的方法来做到这一点:askubuntu.com/questions/11709/…–
Mark Plotnick

@Gilles Ubuntu 14.04.3 LTS
2016年

Answers:


23

您正在寻找strace!我在askubuntu上找到了这个答案,但是它对于Unix是有效的:

要启动和监视新过程:

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

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

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

否则,但是这特定于Linux,您可以在隔离的网络名称空间中运行该过程,并使用wirehark监视流量。这可能比阅读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
strace实际上是特定于Linux内核的,因此它不适用于所有类似Unix的操作系统。据我了解,类似BSD的系统具有类似的实用程序(DTrace和truss)。无论如何,好的答案(如此赞成)。欢迎使用Stack Exchange。
安东尼·G-莫妮卡的大法官

答案似乎点到正确的方向,但是我在解释问题strace输出,同时检查git fetch。我期望输出中包含某种URL,这也是OP所要求的。有人可以帮忙吗?
andreee

14

尝试

lsof -i -a -p `pidof firefox`

它可以部分工作:打印该进程的一些当前连接,但随后会自动关闭。对于一些程序的输出只有这样的警告:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴜsᴇʀ

您可以添加选项-r1以每秒重复一次输出并-w禁止显示警告。
alxrem 2015年

2
这仅显示某个时间点的连接,没有列出流程在其生命周期内建立的所有连接。即使您将此命令置于循环中,它也会错过短暂的连接。
吉尔(Gilles)'所以

发问者没有要求查看其整个生命周期中的连接。一个人可以解释(in real-time)from the point in time of tracking and forward
llua 2015年

8

这是另一种方法:

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))

1
这仅显示某个时间点的连接,没有列出流程在其生命周期内建立的所有连接。即使您将此命令置于循环中,它也会错过短暂的连接。
吉尔(Gilles)'所以

5

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

netstat-打印网络连接,路由表,接口统计信息,伪装连接和多播成员身份

要仅显示网络连接,请使用netstat -tup。请注意,要查看过程PID,您可能需要是root用户。

如果您netstat的系统上没有ss,则可能具有,其语法几乎完全相同。您可以ss -tup(然后以root身份)使用。


1
这仅显示某个时间点的连接,没有列出流程在其生命周期内建立的所有连接。即使您将此命令置于循环中,它也会错过短暂的连接。
吉尔(Gilles)'所以

1
netstat -p | grep firefox | grep tcp
Philip Kirkbride

@Gilles,这对于任何想在某个时间点查看连接的人来说都是一个很好的答案。就像我最近的情况一样。
Jose Antonio恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.