어떤 애플리케이션이 어떤 네트워크 인터페이스를 사용하고 있는지 감지

어떤 애플리케이션이 어떤 네트워크 인터페이스를 사용하고 있는지 감지

어떤 애플리케이션이 어떤 네트워크 인터페이스를 사용하고 있는지 확인할 수 있습니까?

예를 들어 Wi-Fi 연결과 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을 사용합니다.

스카이프의 경우:

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

프로세스 ID가 여기에 표시됩니다.

멀티캐스트 수신기를 찾을 수도 있습니다(예: "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. 커널 우회를 사용하는 애플리케이션과 관련이 있을 수 있습니다(그저 추측일 뿐입니다).

관련 정보