ping 은 ICMP, 즉 3계층 프로토콜이다. 응답 패킷에 상대의 MAC 주소가 담겨 오는 것이 아니다. 다만 같은 L2 세그먼트에 있는 상대에게 패킷을 보내려면 OS 가 먼저 ARP 로 MAC 을 알아내야 하므로, ping 을 한 뒤 ARP 캐시를 보면 결과적으로 MAC 을 알 수 있다.
여기서 중요한 조건은 같은 L2 세그먼트 다. 라우터를 넘어가는 상대의 MAC 은 알 수 없다. 이 경우 ARP 캐시에 남는 것은 게이트웨이의 MAC 이다.
ping -c 1 192.0.2.20
ip neigh show 192.0.2.20
192.0.2.20 dev eth0 lladdr 00:1c:42:aa:bb:cc REACHABLE
lladdr 뒤가 MAC 주소다. arp -n 도 같은 정보를 보여 주지만 net-tools 패키지가 필요하고 사용 중단된 명령이다. ip neigh 를 쓴다.
응답이 오지 않으면 상태가 FAILED 나 INCOMPLETE 로 남는다.
| 상태 | 뜻 |
|---|---|
REACHABLE |
최근에 확인된 유효한 항목 |
STALE |
오래됐지만 아직 보관 중. 쓰기 전에 재확인한다 |
INCOMPLETE |
ARP 요청을 보냈으나 응답이 없다 |
FAILED |
해석에 실패했다 |
PERMANENT |
수동으로 넣은 고정 항목 |
ICMP 가 차단된 호스트라도 ARP 에는 응답하는 경우가 많다. 방화벽이 ping 을 막는 환경에서 유용하다.
arping -c 3 -I eth0 192.0.2.20
Unicast reply from 192.0.2.20 [00:1C:42:AA:BB:CC] 1.234ms
arping 은 배포판에 따라 iputils-arping 또는 arping 패키지에 있다. 구현체마다 옵션이 조금 다르다.
같은 대역 전체를 훑으려면 다음을 쓴다.
nmap -sn 192.0.2.0/24
ip neigh show dev eth0
arp-scan 이 있으면 더 직접적이다.
arp-scan --interface=eth0 --localnet
잘못된 항목이 남아 통신이 안 되는 경우가 있다. IP 를 다른 장비로 옮겼을 때 흔하다.
ip neigh flush dev eth0
ip neigh del 192.0.2.20 dev eth0
고정 항목을 넣을 수도 있다. 임시 진단 외에는 권하지 않는다. 장비를 교체하면 통신이 끊긴다.
ip neigh add 192.0.2.20 lladdr 00:1c:42:aa:bb:cc dev eth0 nud permanent
ping 192.0.2.20
arp -a 192.0.2.20
Get-NetNeighbor -IPAddress 192.0.2.20
정상인 경우와 문제인 경우가 있다.
IP 충돌은 로그에도 남는다.
journalctl -k | grep -i "duplicate address\|arp"
MAC 이 어느 포트에 붙어 있는지는 스위치에서 본다. 서버 쪽에서는 알 수 없다.
show mac address-table address 001c.42aa.bbcc
명령 형식은 장비 제조사마다 다르다.