많은 프로세스를 생성하는 네트워크 집약적인 응용 프로그램을 실행하는 컴퓨터가 있습니다. 나는 최근에 컴퓨터가 존재하지 않는 IP 주소를 찾기 위해 ARP 요청을 생성하고 있음을 발견했습니다. 문제 해결을 위해 상자의 어떤 프로세스가 ARP 요청을 생성하는지 추적하고 싶습니다. 따라서 응용 프로그램의 어떤 부분이 존재하지 않는 IP를 찾고 있는지 알 수 있습니다.
IP가 변경되었지만 어쨌든 중요하지 않습니다.
tcpdump
동일한 네트워크의 다른 컴퓨터에서 실행하여 이러한 ARP 요청을 발견했습니다.
# tcpdump -i eth0 arp -t -n
ARP, Request who-has 1.1.1.100 tell 1.1.1.1, length 46
주소가 있는 장치가 있다는 의미는 아니므 로 어떤 프로세스가 해당 장치를 찾고 있는지 1.1.1.100
찾고 싶습니다 .1.1.1.1
저도 사용해 보았습니다 ss -np | grep 1.1.1.100
( netstat -np | grep 1.1.1.100
궁금한 분들을 위해 netstat
더 이상 사용되지 않는 것으로 간주되며 대부분 동일한 옵션이 있으며 동일한 기능을 수행하도록 설계되었습니다). 이들 중 어느 것도 결과를 반환하지 않습니다. 아마도 열린 소켓이 나열되지 않고 ARP 요청이 소켓이 생성되기 전에 발생하기 때문일 것입니다.ss
ss
ss
netstat
그렇다면 ARP 요청을 발생시킨 프로세스를 식별하는 방법은 무엇입니까?
답변1
ss
arp에 의해 아직 해결되지 않은 연결이 표시됩니다. 그들은 구역에 있습니다 SYN-SENT
. 문제는 이 상태가 연결이 실패하기 몇 초 동안만 유지되기 때문에 보지 못할 수도 있다는 점입니다. 빠른 폴링을 사용해 볼 수 있습니다
while ! ss -p state syn-sent | grep 1.1.1.100; do sleep .1; done
이 상태를 연장하는 한 가지 방법은 arp 테이블의 IP 주소에 대해 임의의 유선 MAC 주소를 설정하는 것입니다. 그러면 연결 시간이 초과되는 데 30초 이상이 걸리며 보기가 더 쉬워집니다 ss
.
예를 들어 내 eth0은 192.168.1.1에 있습니다.
$ socat tcp:192.168.1.100:80 -
$ arp -i eth0 -n | grep 192.168.1.100
192.168.1.100 (incomplete) eth0
Mac 주소를 설정하면 socat이 쉽게 표시됩니다.
$ sudo arp -i eth0 -s 192.168.1.100 80:ef:00:ff:ff:ff
$ socat tcp:192.168.1.100:80 - &
$ ss -p state syn-sent
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp 0 1 192.168.1.1:46608 192.168.1.100:http users:(("socat",pid=20230,fd=3))
답변2
당신은 그것을 사용할 수 있습니다인터넷돼지프로세스별 네트워크 트래픽을 표시하는 프로그램입니다. 그러나 arp는 실행 중인 프로세스에서 직접 생성되지 않고 운영 체제에서 생성됩니다. 일부 프로그램은 1.1.1.100과 통신하려고 할 수 있지만 해당 IP가 ARP 테이블에 존재하지 않으므로 운영 체제는 MAC 주소 테이블을 채우기 위해 ARP 패킷을 보냅니다.
DHCP 서버가 1.1.1.1에서 실행되고 있습니까? 내가 말하려는 것은 DHCP 서버가 임대 범위 내의 주소를 조사하여 그 중 어느 것이 무료인지 확인한다는 것입니다.
답변3
방금 같은 문제가 발생했습니다. 몇 가지를 시도한 후 sysdig로 돌아갔습니다. 이것은 나에게 잘 작동합니다.
sysdig fd.rip=1.1.1.100
제 경우에는 문제의 IP가 실제로 172.28.210.22이고 출력은 다음과 같습니다.
# sysdig fd.rip=172.28.210.22
5987580 15:42:55.952661802 7 dhclient (1232) < sendto res=300 data=...............*............RT..................................................
6318682 15:43:01.237021372 7 dhclient (1232) > sendto fd=6(<4u>172.28.210.22:67->172.28.208.42:68) size=300 tuple=0.0.0.0:68->172.28.210.22:67
6318683 15:43:01.237080305 7 dhclient (1232) < sendto res=300 data=...............*............RT..................................................
6926596 15:43:10.092470330 7 dhclient (1232) > sendto fd=6(<4u>172.28.210.22:67->172.28.208.42:68) size=300 tuple=0.0.0.0:68->172.28.210.22:67
6926608 15:43:10.092541255 7 dhclient (1232) < sendto res=300 data=...............*............RT..................................................
8882391 15:43:31.595024934 7 dhclient (1232) > sendto fd=6(<4u>172.28.210.22:67->172.28.208.42:68) size=300 tuple=0.0.0.0:68->172.28.210.22:67
이는 이것이 dhclient에서 온 것임을 분명히 보여줍니다.