어떤 애플리케이션이 어떤 네트워크 인터페이스를 사용하고 있는지 확인할 수 있습니까?
예를 들어 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
. 커널 우회를 사용하는 애플리케이션과 관련이 있을 수 있습니다(그저 추측일 뿐입니다).