에듀테크 프로젝트 대시보드
ARP (주소 결정 프로토콜)
같은 네트워크 안에서 컴퓨터는 IP 주소만으로는 프레임을 못 보낸다. 실제로 랜선/와이파이 위를 흐르는 건 MAC 주소가 붙은 프레임이기 때문. ARP(Address Resolution Protocol)는 "이 IP 쓰는 사람, 당신 MAC 주소 좀 알려줘!"라고 온 네트워크에 소리치는 프로토콜이다.
웹 브라우저는 142.250.x.x 같은 IP로 통신한다. 하지만 그 패킷이 우리 집 공유기까지 가려면, 먼저 2계층(데이터링크) 프레임에 담겨야 한다. 프레임의 목적지 칸에는 IP가 아니라 48비트 MAC 주소(a4:83:e7:2b:19:04)가 들어간다.
어느 쪽이든 "IP는 아는데 MAC 을 모르는" 순간이 온다. 이때 등장하는 게 ARP다.
스위치로 연결된 작은 사무실 네트워크다. PC-A 가 다른 컴퓨터에게 데이터를 보내려 한다. A 의 ARP 캐시가 비어 있으면 먼저 ARP 질문을 모두에게 뿌린다. 해당 IP 주인만 대답하고, 나머지는 프레임을 조용히 버린다.
| IP 주소 | MAC 주소 | 상태 |
|---|---|---|
| (비어 있음) | ||
실제로는 arp -a (Windows/macOS) 또는 ip neigh (Linux) 로 볼 수 있다.
항목은 보통 수십 초~수 분 뒤 만료되어 다시 물어본다.
ARP 메시지는 아주 단순하다. 핵심은 4개의 주소 칸이다.
| 필드 | ARP 요청 (A가 C를 찾음) | ARP 응답 (C가 답함) |
|---|---|---|
| Opcode | 1 (request) | 2 (reply) |
| Sender MAC | aa:aa:aa:00:00:0a | cc:cc:cc:00:00:0c |
| Sender IP | 192.168.0.10 | 192.168.0.12 |
| Target MAC | 00:00:00:00:00:00 (모름) | aa:aa:aa:00:00:0a |
| Target IP | 192.168.0.12 | 192.168.0.10 |
| 이더넷 목적지 | ff:ff:ff:ff:ff:ff (전체) | aa:aa:aa:00:00:0a (1:1) |
def send_ip_packet(dst_ip, data): if same_subnet(dst_ip, my_ip, my_mask): next_hop = dst_ip # 같은 랜: 상대에게 직접 else: next_hop = default_gateway # 다른 망: 공유기에게 맡김 if next_hop not in arp_cache: broadcast(ArpRequest(target_ip=next_hop)) # ff:ff:ff:ff:ff:ff reply = wait_for_arp_reply(next_hop) arp_cache[next_hop] = reply.sender_mac # 학습·저장 dst_mac = arp_cache[next_hop] send_frame(dst_mac, data) # 이제 2계층 프레임 완성
ARP 에는 인증이 없다. "내가 192.168.0.1(게이트웨이)이고 MAC 은 나야"라고 아무나 응답을 보낼 수 있고, 받은 쪽은 그냥 캐시를 덮어쓴다. 심지어 묻지도 않았는데 보내는 gratuitous ARP 도 정상 취급된다.
위 데모에서 「ARP 스푸핑 켜기」 를 누르면 PC-D 가 공격자가 되어, A 가 게이트웨이를 찾을 때 자기 MAC 을 게이트웨이 MAC 인 척 응답한다. 그 뒤 A 의 인터넷 트래픽은 전부 D 를 거쳐 흐른다(중간자 공격, MITM).
arpwatch 등으로 MAC 변경 감지