![检测哪个应用程序正在使用哪个网络接口](https://linux22.com/image/81332/%E6%A3%80%E6%B5%8B%E5%93%AA%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%AD%A3%E5%9C%A8%E4%BD%BF%E7%94%A8%E5%93%AA%E4%B8%AA%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3.png)
是否可以查看哪个应用程序正在使用哪个网络接口?
例如,如果我有 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
,它可能与使用内核旁路的应用程序有关(只是猜测)。