사전 ARP
프로토콜

ARP

gabury1고친 사람 github-actions[bot]

ARP 는 같은 망 안에서 인터넷 주소만 아는 상대의 하드웨어 주소를 알아내 주는 프로토콜입니다. 망 전체에 이 인터넷 주소를 쓰는 장비가 누구냐고 묻습니다. 그 주소의 주인이 자기 하드웨어 주소로 답합니다. 데이터를 옆 장비에 건넬 때는 이 하드웨어 주소가 있어야 합니다. 그래서 IPv4 통신은 대개 이 물음에서 시작합니다.

쉽고 빠른 이해

ARP 는 인터넷 주소를 들고 그 주소를 쓰는 장비의 하드웨어 주소를 찾아 주는 문답입니다. 예를 들어 같은 사무실 프린터로 문서를 보내려면 먼저 프린터의 하드웨어 주소를 알아야 합니다.

이게 없으면 인터넷 주소를 알아도 데이터를 옆 장비에 건네지 못합니다. 같은 망(한 공유기에 함께 붙은 장비들처럼 곧장 닿는 범위) 안에서 받을 장비를 가리키는 번호는 하드웨어 주소이기 때문입니다.

어떻게 도는가:

  1. 망 안의 모든 장비에게 「이 인터넷 주소를 쓰는 장비는 하드웨어 주소를 알려 달라」고 외칩니다
  2. 그 인터넷 주소의 주인만 묻는 쪽에게 자기 하드웨어 주소를 답합니다
  3. 묻는 쪽은 답을 표에 잠시 적어 두고 한동안 다시 묻지 않습니다

묻는 상대는 늘 같은 망 안의 장비입니다. 다른 망으로 갈 데이터라면 바깥으로 넘겨주는 공유기의 하드웨어 주소를 묻습니다.

대신 약점이 있습니다. 답이 진짜 주인에게서 왔는지 확인하지 않습니다. 같은 망에 들어온 누군가가 거짓 답을 보내면 데이터가 그 사람 쪽으로 샙니다.

상세

ARP(Address Resolution Protocol, 주소 결정 프로토콜)는 IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)를 보고 그 주소를 쓰는 장비의 MAC 주소(Media Access Control address, 매체 접근 제어 주소)를 알아내는 프로토콜입니다. 개요의 인터넷 주소가 IP 주소입니다. 하드웨어 주소는 MAC 주소입니다.

ARP 는 IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판) 망에서 씁니다. IPv6 에서는 다른 프로토콜이 같은 일을 맡습니다.

이 절은 먼저 주소가 왜 둘이나 필요한지 봅니다. 그다음 한 번 묻고 답하는 왕복과 그 답을 적어 두는 표를 봅니다. 끝으로 답을 의심하지 않는 성질이 어떤 공격을 부르는지 봅니다.

교실에서 이름만 아는 사람을 찾는 장면과 닮았습니다. 모두에게 들리게 이름을 부르면 그 사람만 손을 듭니다. 부른 사람은 그 얼굴을 한동안 기억해 두고 다음에는 부르지 않고 곧장 찾아갑니다. 이름은 IP 주소에 해당합니다. 얼굴은 MAC 주소에 해당합니다.

주소가 둘인 까닭

IP 는 데이터를 패킷이라는 덩어리로 나눠 나릅니다. 망과 망 사이는 라우터라는 장비가 잇습니다. 패킷은 라우터를 여러 개 거쳐 목적지에 닿습니다.

IP 주소는 출발지에서 목적지까지 가는 전체 길에서 상대를 가리킵니다. 패킷이 라우터를 몇 개 거치든 목적지 IP 주소는 최종 목적지를 가리킵니다.

MAC 주소는 바로 옆 장비까지의 한 구간만 맡습니다. 네트워크 카드마다 하나씩 붙어 나오는 번호입니다. 같은 망 안에서 데이터를 건넬 때 받을 장비를 이 번호로 적습니다.

같은 망은 라우터를 거치지 않고 데이터가 곧장 닿는 범위입니다. 한 스위치에 선으로 물린 장비들이나 한 공유기에 붙은 장비들이 그렇습니다. 스위치는 같은 망의 장비들을 묶어 데이터를 건네주는 장비입니다.

이더넷이나 와이파이는 데이터를 프레임이라는 단위로 나릅니다. 프레임 머리에는 받을 장비와 보낸 장비의 MAC 주소를 적습니다. 그래서 IP 주소만 알고 MAC 주소를 모르면 프레임을 만들 수 없습니다. ARP 가 이 빈칸을 채웁니다.

묻고 답하는 한 왕복

ARP 가 주고받는 메시지는 둘입니다. 묻는 요청과 답하는 응답입니다. 이 소절은 두 메시지가 누구에게 가고 무엇을 싣는지 봅니다.

요청은 브로드캐스트로 보냅니다. 브로드캐스트는 같은 망의 모든 장비에게 한꺼번에 가는 전송입니다. 받을 MAC 주소 칸에 모든 비트가 1 인 주소 ff:ff:ff:ff:ff:ff 를 적으면 스위치가 그 프레임을 모든 장비에 돌립니다.

요청을 받은 장비는 찾는 IP 주소가 자기 것인지 봅니다. 자기 것이 아니면 버립니다. 자기 것이면 응답을 만들어 묻는 쪽 하나에게만 보냅니다. 이렇게 한 장비만 겨냥한 전송을 유니캐스트라고 합니다.

sequenceDiagram
    participant A as 묻는 쪽 · 192.168.0.10
    participant C as 다른 장비
    participant B as 주인 · 192.168.0.20
    Note over A,B: 요청 하나를 브로드캐스트로 보낸다
    A->>C: 요청 · 192.168.0.20 은 누구인가
    A->>B: 같은 요청
    Note over C: 내 주소가 아니다 · 버린다
    B-->>A: 응답 · 192.168.0.20 은 bb:bb:bb:bb:bb:bb

그림에서 요청 하나가 망의 모든 장비에 갑니다. 응답은 묻는 쪽 하나에게만 돌아옵니다. 묻는 쪽의 MAC 주소는 요청에 실려 왔으므로 주인은 응답을 보낼 곳을 따로 알아낼 필요가 없습니다.

요청과 응답은 같은 모양의 메시지입니다. 주소 칸 앞에 요청인지 응답인지 적는 칸이 따로 있습니다. 그 밖에는 주소 칸 넷에 무엇을 적는지만 다릅니다. 위 그림의 왕복을 칸별로 적으면 아래와 같습니다. 묻는 쪽의 MAC 주소는 aa:aa:aa:aa:aa:aa 로 둡니다.

칸 요청 응답
요청·응답 구분 요청 응답
보내는 쪽 MAC 주소 aa:aa:aa:aa:aa:aa bb:bb:bb:bb:bb:bb
보내는 쪽 IP 주소 192.168.0.10 192.168.0.20
대상 MAC 주소 모르므로 비워 둠 aa:aa:aa:aa:aa:aa
대상 IP 주소 192.168.0.20 192.168.0.10

요청에서는 대상 MAC 주소 칸이 비어 있습니다. 이 빈칸이 곧 물음입니다. 응답은 칸을 뒤집어 채웁니다. 주인이 보내는 쪽이 됩니다. 찾던 MAC 주소는 보내는 쪽 MAC 주소 칸에 들어갑니다.

답을 적어 두는 ARP 캐시

IP 패킷을 보낼 때마다 묻는다면 패킷 하나마다 왕복이 하나씩 더 붙습니다. 그래서 받은 답을 ARP 캐시라는 표에 적어 둡니다. 표에는 IP 주소와 그에 맞는 MAC 주소가 한 줄씩 들어갑니다. 다음 패킷은 표에서 MAC 주소를 꺼내 바로 보냅니다.

표는 묻는 쪽만 채우지 않습니다. 주인도 요청을 받으면서 요청에 실린 묻는 쪽의 IP 주소와 MAC 주소를 자기 ARP 캐시에 적어 둡니다. 곧 그쪽으로 데이터를 보낼 일이 생기기 쉽기 때문입니다. 그러면 주인은 그쪽으로 보낼 데이터가 생겨도 따로 묻지 않습니다.

적어 둔 줄은 한동안 지나면 지웁니다. 같은 IP 주소를 다른 장비가 넘겨받거나 네트워크 카드가 바뀌면 옛 답이 틀린 답이 되기 때문입니다. 지운 뒤에 다시 보낼 일이 생기면 새로 묻습니다. 얼마 뒤에 지우는지는 운영체제마다 다릅니다.

묻고 나서 답을 기다리는 동안 보낼 패킷은 잠시 붙잡아 둡니다. 몇 번 다시 물어도 답이 없으면 붙잡아 둔 패킷을 버립니다. 보낸 프로그램은 상대에 닿을 수 없다는 오류를 받습니다. 상대가 꺼져 있거나 망에서 빠져 있으면 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 연결을 맺기도 전에 이 단계에서 막힙니다.

캐시 내용은 명령으로 볼 수 있습니다. 여러 운영체제에서 arp -a 가 캐시를 보여 줍니다. 리눅스에서는 ip neigh 도 씁니다. 같은 망의 서버와 통신이 안 될 때 캐시에 그 서버의 MAC 주소가 있는지부터 보면 ARP 단계에서 막혔는지 가릴 수 있습니다.

IP 패킷에 실리지 않는 메시지

ARP 메시지는 IP 패킷 안에 들어가지 않습니다. 이더넷 프레임에 곧장 실립니다. 프레임 머리에는 안에 든 것이 무엇인지 적는 타입 칸이 있습니다. 이 칸이 IP 패킷과 ARP 메시지를 가릅니다.

flowchart TD
    subgraph F["이더넷 프레임"]
        H["프레임 머리 · 받을 MAC 주소 · 보낸 MAC 주소 · 타입"]
        subgraph P["타입 칸이 가리키는 내용물"]
            A["ARP 메시지"]
            I["IP 패킷"]
        end
    end

그림에서 ARP 메시지와 IP 패킷은 둘 다 타입 칸이 가리키는 내용물입니다. ARP 메시지는 IP 패킷에 담기지 않고 IP 패킷과 나란히 프레임에 실립니다. ARP 는 IP 에 실려 가는 프로토콜이 아닙니다. IP 곁에서 IP 가 쓸 MAC 주소를 찾아 주는 프로토콜입니다.

이 때문에 ARP 는 라우터를 넘지 못합니다. 라우터는 IP 패킷의 목적지 주소를 보고 다음 망으로 넘깁니다. ARP 메시지에는 목적지 주소를 적은 IP 패킷의 머리가 없습니다. 브로드캐스트도 라우터에서 멈춥니다. 그래서 ARP 로 물을 수 있는 상대는 같은 망 안의 장비뿐입니다.

다른 망의 상대에게 보낼 때

목적지가 다른 망에 있으면 ARP 로 목적지를 물을 수 없습니다. 이 소절은 그때 누구에게 묻는지 봅니다. 답은 기본 게이트웨이입니다.

서브넷 마스크는 IP 주소에서 망을 가리키는 앞부분이 어디까지인지 적은 값입니다. 컴퓨터는 자기 IP 주소와 목적지 IP 주소에 서브넷 마스크를 씌워 앞부분을 견줍니다. 앞부분이 같으면 같은 망입니다. 이때는 목적지 IP 주소로 곧장 ARP 를 묻습니다.

앞부분이 다르면 다른 망입니다. 이때는 기본 게이트웨이의 IP 주소로 ARP 를 묻습니다. 기본 게이트웨이는 다른 망으로 갈 데이터를 넘겨받는 라우터입니다. 집에서는 공유기가 이 역할을 맡습니다.

flowchart TD
    S["보낼 IP 패킷이 생김"] --> Q1{"목적지가 같은 망인가"}
    Q1 -->|예| T1["목적지의 MAC 주소가 필요"]
    Q1 -->|아니오| T2["기본 게이트웨이의 MAC 주소가 필요"]
    T1 --> Q2{"ARP 캐시에 있나"}
    T2 --> Q2
    Q2 -->|있음| SEND["프레임을 만들어 보냄"]
    Q2 -->|없음| ASK["ARP 요청을 보내고 응답을 기다림"]
    ASK --> SEND

그림에서 「아니오」 갈래로 만든 프레임은 두 주소가 서로 다른 곳을 가리킵니다. 받을 MAC 주소는 기본 게이트웨이의 것입니다. 목적지 IP 주소는 최종 목적지의 것입니다.

기본 게이트웨이는 프레임을 받아 IP 패킷을 꺼냅니다. 그리고 다음 망에서 다시 ARP 로 다음 장비의 MAC 주소를 찾아 새 프레임에 담습니다. 길 위의 라우터마다 이 일을 되풀이합니다. 프레임의 MAC 주소는 구간마다 새로 적힙니다. 목적지 IP 주소는 계속 최종 목적지를 가리킵니다.

자기 주소를 스스로 묻는 요청

Gratuitous ARP는 아무도 청하지 않았는데 장비가 자기 IP 주소를 대상으로 보내는 ARP 요청입니다. gratuitous 는 「청하지 않은」이라는 뜻입니다. 모양은 물음입니다. 그런데 보내는 쪽 칸에 자기 IP 주소와 MAC 주소가 실리므로 망 전체에 자기 주소를 알리는 일도 함께 합니다.

이 요청을 받은 장비들은 자기 캐시에 그 IP 주소의 줄이 있으면 새 MAC 주소로 고칩니다.

쓰임은 둘입니다. 첫째는 주소 충돌 확인입니다. IP 주소를 새로 받은 장비가 자기 주소를 대상으로 물어봅니다. 누가 답하면 같은 주소를 쓰는 장비가 이미 있다는 뜻입니다. 이것이 IP 주소 충돌입니다.

둘째는 가상 IP를 옮길 때입니다. 서버 두 대가 IP 주소 하나를 번갈아 맡는 구성이 있습니다. 앞의 서버가 죽어 대기 서버가 그 주소를 넘겨받으면 대기 서버가 이 요청을 보냅니다. 그러면 이웃 장비들의 캐시에 남아 있던 죽은 서버의 MAC 주소가 새 서버의 것으로 바뀝니다.

이 요청이 없으면 이웃 장비들은 캐시의 줄이 지워질 때까지 죽은 서버로 데이터를 보냅니다. 페일오버가 끝나도 한동안 접속이 안 되는 까닭이 여기 있을 수 있습니다.

답을 확인하지 않는 약점

ARP 에는 인증이 없습니다. 받은 응답이 진짜 주인이 보낸 것인지 확인할 방법이 없습니다. 그리고 많은 구현이 묻지 않았는데 온 ARP 메시지도 받아 캐시를 고칩니다. 앞의 Gratuitous ARP 가 동작하는 것도 이 성질 덕분입니다.

ARP 스푸핑이 이 틈을 씁니다. 같은 망에 들어온 공격자가 「기본 게이트웨이의 IP 주소는 내 MAC 주소」라는 거짓 응답을 피해자에게 거듭 보냅니다. 피해자의 캐시가 바뀌면 바깥으로 나가는 데이터가 공격자를 먼저 거칩니다.

sequenceDiagram
    participant 피해자
    participant 공격자
    participant 게이트웨이
    공격자-->>피해자: 거짓 응답 · 게이트웨이 IP 는 공격자 MAC
    Note over 피해자: 캐시의 게이트웨이 줄이 바뀐다
    피해자->>공격자: 바깥으로 나갈 데이터
    공격자->>게이트웨이: 엿본 뒤 넘겨줌

공격자가 받은 데이터를 게이트웨이로 넘겨주면 피해자의 통신은 끊기지 않습니다. 피해자는 누가 끼어든 줄 모릅니다. 이렇게 두 당사자 사이에 끼어 데이터를 엿보거나 바꾸는 공격이 중간자 공격입니다.

막는 수단은 여러 곳에 있습니다. 장비가 스스로 막는 수단, 스위치가 막는 수단, 그리고 TLS(Transport Layer Security, 전송 계층 보안)처럼 통신 내용을 암호화하는 수단입니다. 아래 표는 각 수단이 어디서 돌고 무엇을 막는지 견줍니다.

수단 어디서 무엇을 막나
정적 ARP 항목 각 장비 손으로 고정한 줄이 거짓 응답으로 바뀌는 것
ARP 응답 검사 스위치 거짓 응답이 망에 퍼지는 것
TLS 암호화 통신하는 두 프로그램 가로챈 데이터를 읽거나 몰래 바꾸는 것

TLS 는 ARP 스푸핑 자체를 막지 못합니다. 데이터는 여전히 공격자를 지나갑니다. 대신 인증서 검증이 통과하는 한 공격자는 내용을 읽거나 고치지 못합니다.

IPv6 에서 같은 일을 맡는 이웃 탐색

IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판)에는 ARP 가 없습니다. 같은 일을 이웃 탐색이 맡습니다.

이웃 탐색은 ICMPv6(Internet Control Message Protocol for IPv6, IPv6 용 인터넷 제어 메시지 프로토콜) 메시지로 묻고 답합니다. ICMPv6 는 IP 패킷 안에 실려 가는 제어용 메시지입니다. 그래서 이웃 탐색의 물음은 ARP 와 달리 IP 패킷 안에 실려 갑니다.

물음을 보내는 방식도 다릅니다. 이웃 탐색은 브로드캐스트 대신 멀티캐스트를 씁니다. 멀티캐스트는 한 무리에 든 장비들에게만 가는 전송입니다. 찾는 IP 주소에서 뽑아낸 무리로 물음을 보내므로 상관없는 장비가 물음을 받고 버리는 일이 줄어듭니다.

관련 항목

ARP 가 서로 잇는 주소 체계

IP 주소 · MAC 주소 · IPv4 · 브로드캐스트 주소 · 서브넷 · 서브넷 마스크 · DHCP

ARP 를 실어 나르는 링크 계층 기술

이더넷 · 와이파이 · 프레임 · 링크 계층 · 스위치 · 브로드캐스트 도메인 · 네트워크 카드

ARP 로 MAC 주소를 찾는 다음 장비

기본 게이트웨이 · 라우터 · 다음 홉 · 라우팅 · 라우팅 테이블

ARP 를 이루는 메시지와 동작

ARP 요청 · ARP 응답 · ARP 캐시 · 정적 ARP · Gratuitous ARP · 프록시 ARP · 브로드캐스트 · 유니캐스트

ARP 를 악용하는 공격

ARP 스푸핑 · 중간자 공격 · MAC 스푸핑 · MAC 플러딩 · 세션 하이재킹 · 스니핑

ARP 공격을 막는 수단

동적 ARP 검사 · 포트 보안 · TLS · HTTPS · VPN · 인증서

ARP 알림에 기대는 장애 대응 구성

가상 IP · 페일오버 · VRRP · keepalived · IP 주소 충돌 · 고가용성

ARP 를 대신하거나 거꾸로 푸는 프로토콜

이웃 탐색 · ICMPv6 · IPv6 · RARP · InARP · 멀티캐스트

ARP 를 들여다보는 명령과 도구

arp · ip neigh · arping · tcpdump · Wireshark

ARP 가 속하는 상위 분류

네트워크 · 프로토콜 · 네트워크 계층 · 인터넷 프로토콜 스위트 · OSI 모형 · IP · TCP

다른 이름: Address Resolution Protocol · 주소 결정 프로토콜 · 주소 해석 프로토콜