检测哪个应用程序正在使用哪个网络接口

检测哪个应用程序正在使用哪个网络接口

是否可以查看哪个应用程序正在使用哪个网络接口?

例如,如果我有 wifi 连接和 LAN 电缆,有没有办法获得明确的答案“skype: eth0”或“google chrome: wlan0”?

答案1

我认为,您应该使用wire-shark或tcpdump捕获数据包,并通过查看地址来查看哪个应用程序正在使用哪个ip(以​​及接口)进行通信。

更新1

您可以通过命令获取进程 ID pgrep,然后使用以下命令:

   lsof -Pan -p PID -i

例子:

pgrep firefox
23533

lsof -Pan -p 23533 -i
 COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
 firefox 23533 iahmad   73u  IPv4 1317376      0t0  TCP   137.138.52.207:59237->104.16.116.182:80 (ESTABLISHED)
 firefox 23533 iahmad   74u  IPv4 1317600      0t0  TCP 137.138.52.207:46223->66.220.158.19:443 (ESTABLISHED)
 firefox 23533 iahmad   75u  IPv4 1316597      0t0  TCP 137.138.52.207:32950->198.252.206.25:443 (ESTABLISHED)
 firefox 23533 iahmad   79u  IPv4 1317730      0t0  TCP 137.138.52.207:32989->198.252.206.25:443 (ESTABLISHED)
 firefox 23533 iahmad   80u  IPv4 1317759      0t0  TCP 137.138.52.207:45125->31.13.71.7:443 (ESTABLISHED)

所以如果我执行ip a s命令,137.138.52.207 就是我的 eth0。 Firefox 使用的是 eth0。

对于 Skype:

   pgrep skype
   24611

然后执行以下操作:

   lsof -Pan -p 24611 -i

还将显示 Skype 的界面。

答案2

我们中的一些人在工作时间使用 tcpdump 非常谨慎。它可以为收到的每个数据包增加 25% 的额外处理时间,如 所示strace(1),因此在繁忙的系统上,在最方便的时间使用它并不是一个真正的选择(当网络处理时间增加 25% 时,人们会抱怨)在经历高流量的接口上)。所以,tcpdump 可能已经出局了。

当 tcpdump 不可用时要采取的步骤:

首先,看看你的界面。查看哪些可能具有高吞吐量:

human=-h  # Make this empty if you want full output: human=""

{ echo . interface . \\ bytes pkts err drop ovrrun mcast \\ . \\ bytes pkts err drop carr collsn ; ip -o -s $human link show | sed -e 's/<.* RX:/RX:/' -e 's/bytes.*mcast//' -e 's/bytes.*collsns//' -e 's/\\  *altname.*//' -e 's/  *$//'; } | column -t

这将显示自上次系统重新启动以来通过每个接口的网络数据包和字节数。输出将如下所示:

.    interface         .    \  bytes  pkts   err   drop   ovrrun  mcast  \  .    \  bytes  pkts   err  drop  carr  collsn
1:   lo:               RX:  \  119G   366M   0     0      0       0      \  TX:  \  119G   366M   0    0     0     0
2:   em1:              RX:  \  1.30T  1.59G  0     30.4k  0       613M   \  TX:  \  900G   846M   0    0     0     0
3:   p1p1:             RX:  \  23.8G  176M   0     15.3k  0       153M   \  TX:  \  80.5M  698k   0    0     0     0

很好地显示您的 IP 地址:

/usr/sbin/ip -o -4 a | sed -e 's/^.*: //' -e '/host lo/d' -e 's/ brd .*//' -e 's/ inet //' | sort | column -t

这将为您提供如下输出:

em1        10.172.10.44/23
p1p1       10.173.43.190/24

接下来,在利用率高的接口上(我们假设我们对本场景中的 p1p1 感兴趣),执行以下操作:

ss -tulpn | grep 10.173.43.190

这将为您提供如下输出,并显示该接口上的连接和侦听进程:

udp    UNCONN     0      0      10.173.43.190:28003                 *:*                   users:(("Main",pid=235446,fd=51))
tcp    LISTEN     0      5      10.173.43.190:21000                 *:*                   users:(("httpd",pid=54079,fd=17))

您的进程 pid 会显示在那里。

您还可以找到多播侦听器(由于“dev inet”选项而给出的基于 ipv4 的示例):

ip -o maddr show dev inet | grep p1p1

给出如下输出:

8:      p1p1\   inet  239.164.10.1

然后您可以ss -tulpn | grep 239.164按照上面的内容检查命令输出。但是,有一些注意事项 - 请参阅https://stackoverflow.com/questions/15892675/listing-multicast-sockets 具体来说:“多播套接字不绑定到地址,它只参与多播组(IP_ADD_MEMBERSHIP)。套接字可以在同一接口上加入多个不同的组,或在不同接口上加入同一组”

我已经看到 pid 显示在该ss输出中,但我也看到该输出中缺少一些多播组。我不确定为什么多播会出现在ip -o maddr show而不是出现ss,它可能与使用内核旁路的应用程序有关(只是猜测)。

相关内容