ARP(주소 결정 프로토콜)
같은 네트워크 안의 두 컴퓨터가 데이터를 주고받을 때, 우리는 보통 상대의 IP 주소로 통신한다고 생각합니다. 그런데 이더넷 같은 LAN에서 프레임이 실제로 전달되는 기준은 IP 주소가 아니라 네트워크 카드에 붙은 MAC 주소입니다. 상대의 IP 주소는 알지만 MAC 주소는 모를 때, 이 둘을 이어 주는 것이 ARP(Address Resolution Protocol, 주소 결정 프로토콜)입니다. ARP는 "이 IP 주소를 가진 장치는 자기 MAC 주소를 알려 달라"고 같은 네트워크 전체에 묻고, 주인이 답하면 그 대응을 잠시 저장해 두었다가 다음 전송에 다시 씁니다.
이 토픽에서는 ARP 요청이 왜 브로드캐스트로 나가고 응답은 왜 유니캐스트로 오는지, 한 번 알아낸 대응을 캐시에 저장하는 방식, 그리고 다른 네트워크의 목적지에는 목적지가 아니라 게이트웨이의 MAC 주소를 묻는다는 점을 단계별로 봅니다.
핵심 개념
IP 주소와 MAC 주소
IP 주소는 네트워크 계층에서 최종 목적지를 가리키고, MAC 주소는 링크 계층에서 같은 네트워크 안의 다음 장치를 가리킵니다. 이더넷 프레임의 목적지는 MAC 주소로 적습니다.
핵심 개념
ARP 요청
"이 IP 주소의 MAC 주소는 무엇인가"를 묻는 메시지입니다. 상대의 MAC 주소를 모르므로 목적지 MAC을 ff:ff:ff:ff:ff:ff(브로드캐스트)로 해서 같은 네트워크 전체에 보냅니다.
핵심 개념
ARP 응답
요청에 대한 ARP 응답은, 요청한 IP 주소의 주인이 자기 MAC 주소를 담아 요청한 장치에게만 유니캐스트로 보냅니다. 다른 장치는 자기 IP가 아니면 요청에 응답하지 않습니다.
핵심 개념
ARP 캐시
알아낸 IP와 MAC의 대응을 일정 시간 저장하는 표입니다. 캐시에 있으면 요청 없이 바로 프레임을 보내고, 일정 시간이 지나면 항목이 지워지거나 다시 확인됩니다.
핵심 개념
기본 게이트웨이
같은 네트워크 밖으로 가는 패킷을 대신 받아 전달하는 라우터입니다. 밖으로 보낼 때 ARP로 알아내는 MAC 주소는 최종 목적지가 아니라 이 게이트웨이의 것입니다.
핵심 개념
브로드캐스트 도메인
링크 계층의 브로드캐스트가 닿는 범위입니다. 라우터는 브로드캐스트 프레임을 다른 네트워크로 넘기지 않으므로, ARP는 보통 같은 네트워크 안에서만 동작합니다.
ARP의 배경
ARP는 1982년 David Plummer가 RFC 826 "An Ethernet Address Resolution Protocol"으로 정의했습니다. 이더넷에서 IP 같은 상위 프로토콜의 주소를 48비트 이더넷 주소로 동적으로 대응시키는 방법을 정의한 문서입니다. 이 방식은 지금도 IPv4 네트워크의 기본 동작입니다. IPv6에서는 ARP 대신 이웃 탐색(Neighbor Discovery, NDP)이 같은 역할을 합니다.
숫자로 확인하기
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
ARP는 무엇이고 왜 필요한가요?
IP 주소를 알 때 같은 네트워크 안의 그 장치의 MAC 주소를 알아내는 프로토콜입니다. LAN에서 프레임은 MAC 주소로 전달되므로 IP 통신 전에 MAC 주소가 필요합니다.
면접 질문
ARP 요청은 왜 브로드캐스트인가요?
상대의 MAC 주소를 모르기 때문에 특정 장치에게 보낼 수 없고, 같은 네트워크 모두에게 묻습니다. 자기 IP가 맞는 장치만 응답합니다.
면접 질문
다른 네트워크의 서버에 접속할 때 ARP는 어떻게 동작하나요?
목적지 IP가 같은 서브넷 밖이면 기본 게이트웨이로 보내야 하므로 게이트웨이의 IP에 대한 MAC 주소를 ARP로 알아냅니다. 프레임의 목적지 MAC은 게이트웨이이고, IP 목적지는 최종 서버입니다.
면접 질문
ARP 스푸핑이란 무엇인가요?
공격자가 다른 장치의 IP에 자기 MAC을 대응시키는 거짓 ARP 응답을 보내 캐시를 오염시키는 공격입니다. 트래픽이 공격자를 거치게 되어 도청이나 변조에 쓰일 수 있고, 스위치의 동적 ARP 검사 같은 기능으로 막습니다.
실제 시스템에서는
함께 보면 좋은 토픽
참고 자료
리눅스 셸 — ARP 캐시 보기와 ARP 요청 보내기
# 이웃(ARP) 캐시 보기 ip neigh show # net-tools의 arp 명령으로 보기 arp -a # 192.168.0.20의 MAC 주소를 ARP 요청으로 직접 확인 (root 권한) sudo arping -I eth0 -c 3 192.168.0.20
ip neigh show는 커널이 가진 이웃 캐시를 보여 주며, IPv4에서는 IP 주소에 대응하는 MAC 주소(lladdr)와 항목의 상태(REACHABLE, STALE 등)가 나옵니다. arp -a는 net-tools의 명령으로 같은 정보를 보여 줍니다. arping은 지정한 인터페이스로 ARP 요청을 직접 보내고 응답한 장치의 MAC 주소와 응답 시간을 보여 줍니다. ping과 달리 IP 계층이 아니라 링크 계층에서 동작해, 방화벽이 ICMP를 막아도 같은 네트워크 안의 장치가 켜져 있는지 확인할 수 있습니다(ARP 응답까지 막는 설정이 없다면). 인터페이스 이름 eth0과 IP 주소는 환경에 맞게 바꿔야 하고, 위 옵션은 iputils의 arping 기준이며 다른 구현(Habets arping)은 인터페이스를 -i로 지정합니다.
tcpdump — ARP 요청과 응답 캡처
# arp 패킷만 이더넷 헤더와 함께 출력 (root 권한) sudo tcpdump -i eth0 -n -e arp # 출력 예 (시각은 생략) 02:00:00:00:00:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.0.20 tell 192.168.0.10, length 28 02:00:00:00:00:0b > 02:00:00:00:00:0a, ethertype ARP (0x0806), length 42: Reply 192.168.0.20 is-at 02:00:00:00:00:0b, length 28
tcpdump의 arp 필터는 ARP 패킷만 잡고, -e 옵션은 이더넷 헤더(출발지 MAC, 목적지 MAC, 유형)를 함께 보여 줍니다. 위 출력은 시각화와 같은 값으로 쓴 예시입니다. 요청은 목적지 MAC이 ff:ff:ff:ff:ff:ff(브로드캐스트)이고 who-has 192.168.0.20 tell 192.168.0.10으로 표시됩니다. 응답은 요청한 장치의 MAC으로 직접 가고 is-at 뒤에 알아낸 MAC 주소가 나옵니다. ARP 메시지 자체가 28바이트이고 이더넷 프레임은 그에 헤더가 붙은 크기(여기서는 42바이트로 표시)입니다. 실제 출력의 형식은 tcpdump 버전에 따라 조금 다를 수 있습니다.
Python (scapy) — ARP 요청을 직접 만들기
from scapy.all import ARP, Ether, srp # 브로드캐스트 프레임에 ARP 요청 실어 보내기 (root 권한) pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst="192.168.0.20") ans, _ = srp(pkt, timeout=2, verbose=False) for sent, recv in ans: print(recv.psrc, recv.hwsrc) # 응답한 IP와 MAC
scapy는 패킷을 직접 만들어 보내는 파이썬 라이브러리로, 별도로 설치해야 합니다. Ether(dst=...)는 이더넷 헤더를 만들고 ARP(pdst=...)는 "이 IP의 MAC은?"이라는 ARP 요청을 만들며, / 연산자로 계층을 쌓습니다. srp는 링크 계층 프레임을 보내고 응답을 받아 오는 함수이고, 응답의 psrc와 hwsrc가 각각 응답한 장치의 IP 주소와 MAC 주소입니다. 직접 만든 ARP는 자신이 속한 네트워크에서 자기가 관리하는 장치에만 써야 합니다. 허락 없이 다른 네트워크에 ARP를 보내거나 거짓 응답을 만드는 것은 ARP 스푸핑과 같은 공격이 될 수 있습니다.
Q1
ARP(Address Resolution Protocol)의 목적은?
Q2
ARP 요청(Request) 메시지는 어떤 방식으로 전송될까?
Q3
ARP 응답(Reply)은 어떻게 전달될까?