ping6.net
기초

IPv6 이웃 탐색 프로토콜 (NDP): 장치가 서로를 찾는 방법

ARP를 대체하는 NDP에 대해 자세히 알아봅니다. 라우터 요청, 이웃 요청 및 주소 확인 작동 방식을 배웁니다.

ping6.net2024년 12월 14일22 min read
IPv6NDP이웃 탐색ARP 대체네트워킹

NDP는 ARP 이상을 대체합니다#

IPv4에서 주소 확인은 별도의 계층 2 프로토콜인 ARP를 사용합니다. 라우터 탐색은 ICMP 라우터 탐색 또는 DHCP를 사용합니다. 리디렉션 메시지는 ICMP를 사용합니다. 중복 주소 감지는 전혀 존재하지 않습니다.

IPv6는 이러한 모든 기능을 이웃 탐색 프로토콜로 통합합니다. NDP는 다음을 처리합니다:

  • 주소 확인 (ARP의 역할)
  • 라우터 탐색 (기본 게이트웨이 찾기)
  • 접두사 탐색 (자동 구성을 위한 네트워크 접두사 학습)
  • 매개변수 탐색 (MTU, 홉 제한)
  • 주소 자동 구성 (SLAAC)
  • 중복 주소 감지 (충돌 방지)
  • 이웃 도달 가능성 (내 이웃이 여전히 존재하는가?)
  • 다음 홉 결정 (어떤 라우터를 사용해야 하는가?)
  • 리디렉션 메시지 (더 나은 경로가 존재함)

NDP는 전적으로 ICMPv6를 통해 실행되며 5개의 메시지 유형(133-137)을 사용합니다. 선택 사항이 아닙니다. NDP를 차단하면 IPv6가 작동하지 않습니다.

TL;DR - 빠른 요약

핵심 포인트:

  • NDP는 ARP, 라우터 탐색 및 자동 구성을 ICMPv6를 통해 실행되는 하나의 프로토콜로 통합합니다
  • 5개의 메시지 유형(133-137)이 주소 확인에서 라우터 알림까지 모든 것을 처리합니다
  • 보안: 모든 NDP 메시지는 오프 링크 공격을 방지하기 위해 Hop Limit 255가 필요합니다

바로가기: SLAAC 세부 정보는 라우터 알림, 실제 예시는 주소 확인 실제, 일반적인 문제는 문제 해결을 참조하세요.


5가지 NDP 메시지 유형#

모든 NDP 메시지는 특정 유형 번호를 가진 ICMPv6 패킷입니다. 이 5개의 메시지를 이해하면 IPv6 네트워크가 기본 수준에서 어떻게 작동하는지 이해하는 것을 의미합니다.

유형이름발신자목적대상
133라우터 요청 (RS)호스트라우터 정보 요청ff02::2 (모든 라우터)
134라우터 광고 (RA)라우터존재 및 구성 알림ff02::1 (모든 노드) 또는 유니캐스트
135이웃 요청 (NS)모든 노드주소 확인, 도달 가능성요청된 노드 멀티캐스트 또는 유니캐스트
136이웃 광고 (NA)모든 노드NS에 대한 응답유니캐스트 또는 ff02::1
137리디렉션라우터더 나은 다음 홉 존재유니캐스트 (원래 발신자)

모든 NDP 메시지에는 공통 보안 요구 사항이 있습니다: 홉 제한은 255여야 합니다. 이렇게 하면 라우터가 홉 제한을 감소시키기 때문에 원격 공격을 방지합니다. 원격 공격자의 패킷은 홉 제한 < 255로 도착하여 드롭됩니다.

라우터 요청 (유형 133)#

호스트는 라우터가 다음 예약된 라우터 광고를 기다리지 않고 즉시 자신을 알리기를 원할 때 라우터 요청을 보냅니다.

ICMPv6 구조:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     유형      |     코드      |          체크섬               |
|     (133)     |      (0)      |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            예약                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   옵션 ...
+-+-+-+-+-+-+-+-+-+-+-+-

필드:

  • 유형: 133
  • 코드: 0
  • 예약: 32비트, 0이어야 함
  • 옵션: 소스 링크 계층 주소 (선택 사항, 소스 주소가 ::가 아닌 경우 포함)

전송 시기:

  • 인터페이스가 활성화됨
  • 호스트 부팅
  • IPv6 스택 초기화
  • 호스트가 빠른 구성 필요

소스 주소:

  • 링크 로컬 주소 (구성된 경우)
  • :: (지정되지 않음, 아직 주소가 없는 경우)

대상: ff02::2 (모든 라우터 멀티캐스트 주소)

홉 제한: 255 (필수)

예시 패킷:

IPv6 헤더:
  소스: fe80::a4b2:c3d4:e5f6:7890
  대상: ff02::2
  다음 헤더: 58 (ICMPv6)
  홉 제한: 255
 
ICMPv6:
  유형: 133 (라우터 요청)
  코드: 0
  옵션:
    소스 링크 계층 주소: 00:1a:2b:3c:4d:5e

속도 제한:

호스트는 라우터 요청을 너무 자주 보내서는 안 됩니다. RFC 4861은 3초당 최대 1개를 권장합니다. 이렇게 하면 네트워크 불안정 중에 라우터가 넘치는 것을 방지합니다.

중요한 이유:

RS가 없으면 호스트는 주기적인 라우터 광고(몇 분마다 전송됨)를 기다려야 합니다. RS를 사용하면 호스트가 몇 분이 아닌 몇 초 안에 구성을 얻어 네트워크 초기화 속도를 높일 수 있습니다.

라우터 광고 (유형 134)#

라우터는 라우터 광고를 보내 존재를 알리고, 네트워크 접두사를 광고하며, 구성 매개변수를 제공합니다. 이것은 상태 비저장 주소 자동 구성(SLAAC)의 기초입니다.

ICMPv6 구조:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     유형      |     코드      |          체크섬               |
|     (134)     |      (0)      |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O|H|Prf|Resvd|       라우터 수명             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         도달 가능 시간                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          재전송 타이머                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   옵션 ...
+-+-+-+-+-+-+-+-+-+-+-+-

필드:

현재 홉 제한 (8비트): 나가는 패킷의 홉 제한 필드에 권장되는 값. 일반적으로 64. 호스트는 이를 IPv6 헤더 홉 제한 필드에 복사합니다.

플래그 (8비트):

  • M (관리 주소 구성): 주소에 DHCPv6 사용
  • O (기타 구성): 다른 구성에 DHCPv6 사용 (DNS, NTP 등)
  • H (홈 에이전트): 라우터가 모바일 IPv6 홈 에이전트임 (거의 사용되지 않음)
  • Prf (라우터 선호도): 2비트 선호도 (00=중간, 01=높음, 11=낮음)
  • 예약: 3비트

라우터 수명 (16비트): 이 라우터를 기본 게이트웨이로 사용할 시간(초). 0은 「기본 라우터가 아님」을 의미합니다. 최대 9000초(2.5시간).

도달 가능 시간 (32비트): 도달 가능성 확인을 받은 후 이웃을 도달 가능한 것으로 간주할 시간(밀리초). 0은 지정되지 않음(기본값 또는 이전에 수신한 값 사용)을 의미합니다.

재전송 타이머 (32비트): 이웃 요청 재전송 사이의 시간(밀리초). 주소 확인 및 이웃 도달 불가 감지에 사용됩니다.

일반적인 옵션:

소스 링크 계층 주소 (유형 1): 라우터의 MAC 주소. 호스트가 라우터에 대한 이웃 요청을 건너뛸 수 있도록 합니다.

MTU (유형 5): 링크에 권장되는 MTU. 일반적으로 1500.

접두사 정보 (유형 3): 주소 자동 구성을 위한 네트워크 접두사. 이것은 SLAAC의 중요한 옵션입니다.

RDNSS (유형 25): 재귀 DNS 서버 주소. RFC 8106.

DNSSL (유형 31): DNS 검색 목록. RFC 8106.

전송 시기:

  • 주기적으로 (200-600초마다, 일반적으로 200)
  • 라우터 요청에 대한 응답으로
  • 라우터 구성 변경 시

소스: 라우터의 링크 로컬 주소 (fe80::/10)

대상:

  • ff02::1 (모든 노드 멀티캐스트) 주기적 알림용
  • RS에 응답할 때 요청 호스트에 유니캐스트

홉 제한: 255 (필수)

예시 패킷:

IPv6 헤더:
  소스: fe80::1
  대상: ff02::1
  다음 헤더: 58 (ICMPv6)
  홉 제한: 255
 
ICMPv6:
  유형: 134 (라우터 광고)
  코드: 0
  현재 홉 제한: 64
  플래그: M=0, O=0 (SLAAC만)
  라우터 수명: 1800초 (30분)
  도달 가능 시간: 30000 ms
  재전송 타이머: 1000 ms
 
  옵션:
    소스 링크 계층 주소: 00:11:22:33:44:55
    MTU: 1500
    접두사 정보:
      접두사: 2001:db8:1234:5678::/64
      유효 수명: 86400 (24시간)
      선호 수명: 14400 (4시간)
      플래그: L=1 (링크 내), A=1 (자율/SLAAC)
    RDNSS:
      수명: 3600
      주소: 2001:4860:4860::8888, 2001:4860:4860::8844

플래그 조합:

MO동작
00SLAAC만, DHCPv6 없음 (가장 일반적)
01주소에 SLAAC, DNS/NTP 등에 DHCPv6
10주소에 DHCPv6 (드물게 사용)
11모든 것에 DHCPv6 (기업 네트워크)

접두사 정보 옵션:

이 옵션은 SLAAC를 가능하게 하는 것입니다. 주소를 자동 구성할 때 사용할 네트워크 접두사를 호스트에 알려줍니다.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     유형      |    길이       | 접두사 길이   |L|A|R|예약1    |
|      (3)      |      (4)      |               | | | |         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         유효 수명                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       선호 수명                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           예약2                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                            접두사                             +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

필드:

  • 접두사 길이: SLAAC의 경우 일반적으로 64
  • L 플래그: 링크 내 (접두사가 로컬 링크에 있음)
  • A 플래그: 자율 (SLAAC에 사용)
  • R 플래그: 라우터 주소 (접두사에 라우터의 인터페이스 ID 포함)
  • 유효 수명: 주소가 유효한 시간 (일반적으로 86400 = 24시간)
  • 선호 수명: 새 연결에 주소를 사용할 시간 (일반적으로 14400 = 4시간)
  • 접두사: 실제 네트워크 접두사 (예: 2001:db8:1234:5678::)

A=1일 때 호스트는 접두사를 인터페이스 식별자와 결합하여 주소를 생성합니다:

RA의 접두사:     2001:db8:1234:5678::/64
인터페이스 ID:   a4b2:c3d4:e5f6:7890  (MAC에서 파생 또는 무작위)
결과 주소:       2001:db8:1234:5678:a4b2:c3d4:e5f6:7890

라우터 광고는 중요합니다

ICMPv6 유형 134를 차단하면 SLAAC가 작동하지 않습니다. 호스트는 링크 로컬 주소만 가지며(fe80::/10) 전역 연결이 없습니다. 이것은 가장 일반적인 IPv6 잘못된 구성 중 하나입니다—어떤 유형이 필수적인지 이해하지 못하고 모든 ICMPv6를 차단하는 방화벽.

이웃 요청 (유형 135)#

이웃 요청은 IPv6의 ARP 대체입니다. IPv6 주소를 링크 계층(MAC) 주소로 확인하고 이웃이 여전히 도달 가능한지 확인합니다.

ICMPv6 구조:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     유형      |     코드      |          체크섬               |
|     (135)     |      (0)      |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           예약                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                       대상 주소                               +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   옵션 ...
+-+-+-+-+-+-+-+-+-+-+-+-

필드:

  • 유형: 135
  • 코드: 0
  • 예약: 32비트, 0이어야 함
  • 대상 주소: 쿼리되는 IPv6 주소
  • 옵션: 소스 링크 계층 주소 (소스가 ::가 아닌 경우 포함)

세 가지 사용 사례:

1. 주소 확인 (ARP 대체)#

호스트 A가 동일한 링크의 호스트 B에 패킷을 보내야 하지만 B의 MAC 주소를 모릅니다.

프로세스:

  1. A가 이웃 캐시를 확인—B에 대한 항목 없음
  2. A가 B의 요청된 노드 멀티캐스트 주소로 NS 전송
  3. B가 NS를 수신하고 MAC를 포함하는 NA로 응답
  4. A가 매핑을 캐시하고 원래 패킷 전송

예시:

# 호스트 A가 2001:db8::10으로 전송하려고 함
 
IPv6 헤더:
  소스: 2001:db8::1
  대상: ff02::1:ff00:10  (요청된 노드 멀티캐스트)
  홉 제한: 255
 
ICMPv6:
  유형: 135 (이웃 요청)
  대상 주소: 2001:db8::10
  옵션:
    소스 링크 계층 주소: 00:1a:2b:3c:4d:5e

요청된 노드 멀티캐스트 주소 계산:

IPv6는 효율성을 위해 브로드캐스트 대신 요청된 노드 멀티캐스트를 사용합니다. 유사한 주소를 가진 호스트만 각 요청된 노드 그룹을 수신합니다.

공식: ff02::1:ff + 대상 주소의 마지막 24비트
 
예시:
  2001:db8::10              -> ff02::1:ff00:10
  2001:db8::a4b2:c3d4:e5f6:7890 -> ff02::1:ff:f6:7890
  fe80::1                   -> ff02::1:ff00:1

이렇게 하면 불필요한 처리가 줄어듭니다. IPv4에서 ARP 브로드캐스트는 네트워크의 모든 호스트에 도달합니다. IPv6에서는 주소가 동일한 24비트로 끝나는 호스트만 멀티캐스트 그룹에 가입하고 NS를 수신합니다.

2. 이웃 도달 불가 감지 (NUD)#

이전에 도달 가능했던 이웃이 여전히 도달 가능한지 확인합니다.

프로세스:

  1. 호스트가 최근에 이웃으로부터 트래픽을 받지 못함
  2. 호스트가 이웃에게 NS 전송 (유니캐스트)
  3. NA를 받으면 이웃이 도달 가능
  4. 재시도 후 응답이 없으면 이웃이 도달 불가능한 것으로 간주

예시:

IPv6 헤더:
  소스: 2001:db8::1
  대상: 2001:db8::10  (이웃에게 유니캐스트)
  홉 제한: 255
 
ICMPv6:
  유형: 135 (이웃 요청)
  대상 주소: 2001:db8::10
  옵션:
    소스 링크 계층 주소: 00:1a:2b:3c:4d:5e

NUD는 백그라운드에서 자동으로 실행됩니다. 호스트가 트래픽을 보낼 때 이웃이 응답하는지 추적합니다. 이웃이 침묵하면 NUD는 죽은 것으로 선언하기 전에 도달 가능성을 확인합니다.

3. 중복 주소 감지 (DAD)#

IPv6 주소를 사용하기 전에 호스트는 DAD를 수행하여 다른 노드가 사용하지 않는지 확인합니다. 이렇게 하면 SLAAC에서 주소 충돌을 방지합니다.

프로세스:

  1. 호스트가 임시 주소 생성 (SLAAC, DHCPv6 또는 수동 구성 통해)
  2. 호스트가 소스 ::, 대상 = 임시 주소로 NS 전송
  3. 누군가 NA로 응답하면 주소가 이미 사용 중 (충돌)
  4. 시간 초과 후 응답이 없으면 주소가 고유하고 사용 가능

예시:

# 호스트가 2001:db8::a4b2:c3d4:e5f6:7890 사용하려고 함
# 먼저 DAD NS 전송
 
IPv6 헤더:
  소스: ::  (지정되지 않은 주소—호스트에 아직 주소 없음)
  대상: ff02::1:ff:f6:7890  (요청된 노드 멀티캐스트)
  홉 제한: 255
 
ICMPv6:
  유형: 135 (이웃 요청)
  대상 주소: 2001:db8::a4b2:c3d4:e5f6:7890
  옵션: (없음—소스가 ::)

다른 호스트가 해당 주소를 사용하는 경우 이웃 광고를 보냅니다. 요청 호스트가 충돌을 감지하고 다른 주소를 선택해야 합니다.

DAD 시간 초과: 일반적으로 1초. 호스트는 응답을 기다리는 시간입니다. 침묵하면 주소가 고유한 것으로 간주됩니다.

보안 문제: DAD에는 인증이 없습니다. 공격자는 모든 DAD 요청에 응답하여 호스트가 주소를 구성하지 못하게 할 수 있습니다. 이것을 DAD DoS 공격이라고 합니다. 솔루션에는 SEND(보안 이웃 탐색) 또는 RA Guard가 포함되지만 채택이 제한적입니다.

이웃 광고 (유형 136)#

이웃 요청에 대한 응답으로 또는 주소/링크 계층 변경을 알리기 위해 비요청으로 전송됩니다.

ICMPv6 구조:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     유형      |     코드      |          체크섬               |
|     (136)     |      (0)      |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O|                     예약                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                       대상 주소                               +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   옵션 ...
+-+-+-+-+-+-+-+-+-+-+-+-

필드:

플래그:

  • R (라우터): 발신자가 라우터
  • S (요청됨): 광고가 NS에 대한 응답
  • O (재정의): 기존 캐시 항목 재정의

대상 주소: 이 광고가 전송되는 주소

옵션: 대상 링크 계층 주소 (MAC 주소)

전송 시기:

  • 이웃 요청에 대한 응답 (S=1)
  • 주소 변경의 비요청 알림 (S=0)
  • 링크 계층 주소 변경 후 이웃을 업데이트하기 위한 무상 NA

대상:

  • NS에 응답할 때 요청 노드에 유니캐스트
  • 비요청 알림에 ff02::1 (모든 노드)

홉 제한: 255 (필수)

NS에 대한 예시 응답:

IPv6 헤더:
  소스: 2001:db8::10
  대상: 2001:db8::1  (요청자에게 유니캐스트)
  홉 제한: 255
 
ICMPv6:
  유형: 136 (이웃 광고)
  플래그: R=0, S=1 (요청된 응답), O=1 (재정의)
  대상 주소: 2001:db8::10
  옵션:
    대상 링크 계층 주소: 00:aa:bb:cc:dd:ee

플래그 의미:

S=1: 이것은 NS에 대한 응답입니다. 캐시를 업데이트하십시오.

S=0: 비요청 알림. 내가 무언가를 변경했습니다.

O=1: 이 정보로 기존 캐시 항목을 재정의합니다.

O=0: 항목이 없는 경우에만 캐시를 업데이트합니다.

비요청 NA 예시:

호스트가 MAC 주소를 변경합니다(드물지만 가상 머신 또는 인터페이스 재구성으로 발생). 이웃을 업데이트하기 위해 비요청 NA를 보냅니다:

IPv6 헤더:
  소스: 2001:db8::10
  대상: ff02::1  (모든 노드)
  홉 제한: 255
 
ICMPv6:
  유형: 136 (이웃 광고)
  플래그: R=0, S=0 (비요청), O=1 (재정의)
  대상 주소: 2001:db8::10
  옵션:
    대상 링크 계층 주소: 00:ff:ee:dd:cc:bb  (새 MAC)

모든 이웃이 이것을 수신하고 캐시를 업데이트합니다.

리디렉션 (유형 137)#

라우터는 리디렉션 메시지를 보내 특정 대상에 대해 더 나은 첫 번째 홉 라우터가 있음을 호스트에 알립니다.

ICMPv6 구조:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     유형      |     코드      |          체크섬               |
|     (137)     |      (0)      |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           예약                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                       대상 주소                               +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                     대상 주소                                 +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   옵션 ...
+-+-+-+-+-+-+-+-+-+-+-+-

필드:

  • 유형: 137
  • 코드: 0
  • 대상 주소: 더 나은 다음 홉 라우터 (또는 링크 내인 경우 대상)
  • 대상 주소: 더 나은 경로를 사용해야 하는 대상
  • 옵션: 대상 링크 계층 주소, 리디렉션된 헤더 (원래 패킷의 일부)

전송 시기:

라우터 R1이 호스트 A에서 호스트 B로 향하는 패킷을 수신합니다. R1은 라우터 R2(A와 동일한 링크에 있음)가 B에 대한 더 나은 다음 홉임을 알고 있습니다. R1은 패킷을 R2로 전달하고 향후 R2를 직접 사용하도록 A에게 리디렉션을 보냅니다.

예시 시나리오:

네트워크 토폴로지:
  호스트 A: 2001:db8:1::10
  라우터 R1: 2001:db8:1::1 (A의 기본 게이트웨이)
  라우터 R2: 2001:db8:1::2 (2001:db8:2::/64로의 더 나은 경로)
  대상 B: 2001:db8:2::20
 
흐름:
1. A가 R1을 통해 B에 패킷 전송 (기본 게이트웨이)
2. R1이 R2가 2001:db8:2::/64에 대한 더 나은 다음 홉임을 확인
3. R1이 패킷을 R2로 전달
4. R1이 A에게 리디렉션 전송:
   대상 주소: 2001:db8:1::2 (R2)
   대상 주소: 2001:db8:2::20 (B)
5. A가 라우팅 테이블 업데이트: 2001:db8:2::/64에 R2 사용
6. A의 향후 B로의 패킷이 R2로 직접 이동

R1에서 A로의 리디렉션 메시지:

IPv6 헤더:
  소스: fe80::1  (R1의 링크 로컬)
  대상: 2001:db8:1::10  (호스트 A)
  홉 제한: 255
 
ICMPv6:
  유형: 137 (리디렉션)
  대상 주소: fe80::2  (R2—더 나은 다음 홉)
  대상 주소: 2001:db8:2::20  (B—R2를 통해 도달할 대상)
  옵션:
    대상 링크 계층 주소: 00:11:22:33:44:55 (R2의 MAC)
    리디렉션된 헤더: (리디렉션을 트리거한 원래 패킷 헤더)

보안 고려 사항:

리디렉션 메시지는 남용될 수 있습니다. 로컬 링크의 공격자가 악의적인 리디렉션을 보낼 수 있습니다:

  • 공격자의 머신을 통해 트래픽 라우팅 (중간자)
  • 존재하지 않는 라우터로 리디렉션하여 트래픽 블랙홀
  • 라우팅 루프 생성

보호:

  • SEND(보안 이웃 탐색)가 리디렉션 메시지 인증
  • 많은 호스트가 기본이 아닌 게이트웨이 라우터의 리디렉션 무시
  • 일부 보안 의식이 있는 네트워크는 리디렉션 처리를 완전히 비활성화
  • 리디렉션은 현재 첫 번째 홉 라우터에서 와야 함 (호스트가 확인)

리디렉션을 허용해야 합니까?

홈/소규모 네트워크: 안전합니다. 여러 라우터가 있을 때 라우팅을 최적화합니다.

기업 네트워크: 종종 비활성화됩니다. 제어된 라우팅 테이블과 잠재적 보안 위험이 이점보다 큽니다.

데이터 센터: 일반적으로 비활성화됩니다. 정적 라우팅 또는 동적 프로토콜(BGP, OSPF)이 경로를 관리합니다.

실제 주소 확인#

호스트 A가 동일한 링크의 호스트 B에 패킷을 보내는 전체 프로세스를 추적해 보겠습니다.

초기 상태:

  • 호스트 A: 2001:db8::1 (MAC: aa:aa:aa:aa:aa:aa)
  • 호스트 B: 2001:db8::10 (MAC: bb:bb:bb:bb:bb:bb)
  • A의 이웃 캐시가 비어 있음

1단계: 애플리케이션이 연결 시작

# 호스트 A에서
ping6 2001:db8::10

2단계: 이웃 캐시 확인

# A가 이웃 캐시 확인
ip -6 neigh show 2001:db8::10
# (비어 있음—항목 없음)

3단계: 이웃 요청 전송

A가 요청된 노드 멀티캐스트 주소로 NS 전송:

IPv6 헤더:
  소스: 2001:db8::1
  대상: ff02::1:ff00:10  (2001:db8::10의 요청된 노드)
  홉 제한: 255
 
이더넷 헤더:
  소스 MAC: aa:aa:aa:aa:aa:aa
  대상 MAC: 33:33:ff:00:00:10  (ff02::1:ff00:10의 멀티캐스트 MAC)
 
ICMPv6:
  유형: 135 (이웃 요청)
  대상 주소: 2001:db8::10
  옵션:
    소스 링크 계층 주소: aa:aa:aa:aa:aa:aa

4단계: B가 NS 수신

호스트 B는 ff02::1:ff00:10을 수신합니다(주소가 :10으로 끝나기 때문). NS를 수신하고 처리합니다.

5단계: B가 이웃 광고 전송

IPv6 헤더:
  소스: 2001:db8::10
  대상: 2001:db8::1  (A에게 유니캐스트)
  홉 제한: 255
 
이더넷 헤더:
  소스 MAC: bb:bb:bb:bb:bb:bb
  대상 MAC: aa:aa:aa:aa:aa:aa
 
ICMPv6:
  유형: 136 (이웃 광고)
  플래그: R=0, S=1 (요청됨), O=1 (재정의)
  대상 주소: 2001:db8::10
  옵션:
    대상 링크 계층 주소: bb:bb:bb:bb:bb:bb

6단계: A가 이웃 캐시 업데이트

# A의 이웃 캐시에 이제 항목이 있음
ip -6 neigh show 2001:db8::10
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb REACHABLE

7단계: A가 원래 패킷 전송

이제 A가 B의 MAC를 알고 있으므로 ping 패킷을 전송합니다:

IPv6 헤더:
  소스: 2001:db8::1
  대상: 2001:db8::10
 
이더넷 헤더:
  소스 MAC: aa:aa:aa:aa:aa:aa
  대상 MAC: bb:bb:bb:bb:bb:bb  (NA에서 학습)
 
ICMPv6:
  유형: 128 (에코 요청)

총 시간: 밀리초. 프로세스는 애플리케이션에 보이지 않습니다.

이웃 캐시 상태#

NUD가 도달 가능성을 추적함에 따라 이웃 캐시 항목은 여러 상태를 거칩니다.

상태의미다음 작업
INCOMPLETENS 전송, NA 대기시간 초과 또는 NA 수신
REACHABLENA가 최근에 수신됨, 도달 가능 확인됨트래픽 전송 또는 시간 초과
STALE항목이 오래됨, 최근에 확인되지 않음트래픽 전송 (프로브 트리거)
DELAY오래된 항목으로 트래픽 전송, 대기 중시간 초과가 프로브 트리거
PROBE도달 가능성 확인을 위해 NS 전송NA 수신 또는 시간 초과
FAILED프로브에 응답 없음항목 제거

상태 전환:

INCOMPLETE --NA 수신--> REACHABLE
REACHABLE --시간 초과--> STALE
STALE --트래픽 전송--> DELAY
DELAY --시간 초과--> PROBE
PROBE --NA 수신--> REACHABLE
PROBE --시간 초과--> FAILED

이웃 캐시 확인 (Linux):

ip -6 neigh show
 
# 예시 출력:
# 2001:db8::1 dev eth0 lladdr aa:aa:aa:aa:aa:aa REACHABLE
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb STALE
# fe80::1 dev eth0 lladdr cc:cc:cc:cc:cc:cc DELAY

타이머:

  • REACHABLE 시간 초과: 30초 (구성 가능, RA 도달 가능 시간에서)
  • DELAY 시간 초과: PROBE로 전환하기 전 5초
  • 재전송 간격: 1초 (구성 가능, RA 재전송 타이머에서)
  • MAX_MULTICAST_SOLICIT: FAILED로 선언하기 전 3회 시도

이렇게 하면 불필요한 NUD 트래픽을 최소화하면서 죽은 이웃을 빠르게 감지합니다.

SLAAC: 주소 자동 구성#

라우터 광고를 중복 주소 감지와 결합하면 상태 비저장 주소 자동 구성이 생성됩니다. 호스트는 DHCP 서버 없이 자신을 구성합니다.

전체 SLAAC 프로세스:

1단계: 인터페이스 활성화

호스트가 인터페이스 eth0에서 IPv6를 활성화합니다.

2단계: 링크 로컬 주소 생성

fe80:: + 인터페이스 식별자
fe80::a4b2:c3d4:e5f6:7890  (MAC 파생 IID 사용 시)
fe80::1234:5678:9abc:def0  (무작위 IID 사용 시)

3단계: 링크 로컬에서 DAD 수행

fe80:: 주소가 고유한지 확인하기 위해 소스 ::로 NS 전송.

4단계: 라우터 요청 전송

IPv6 헤더:
  소스: fe80::a4b2:c3d4:e5f6:7890
  대상: ff02::2
  홉 제한: 255
 
ICMPv6:
  유형: 133 (라우터 요청)

5단계: 라우터 광고 수신

ICMPv6:
  유형: 134 (라우터 광고)
  플래그: M=0, O=0 (SLAAC)
  접두사 정보:
    접두사: 2001:db8:1234:5678::/64
    플래그: A=1 (자율)
    유효 수명: 86400
    선호 수명: 14400

6단계: 전역 주소 생성

접두사: 2001:db8:1234:5678::/64
IID: a4b2:c3d4:e5f6:7890
결과: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890

7단계: 전역 주소에서 DAD 수행

2001:db8:1234:5678:a4b2:c3d4:e5f6:7890이 고유한지 확인하기 위해 NS 전송.

8단계: 주소 구성

ip -6 addr show eth0
 
# 출력:
# inet6 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890/64 scope global dynamic
# inet6 fe80::a4b2:c3d4:e5f6:7890/64 scope link

9단계: 기본 경로 설정

라우터의 링크 로컬 주소를 기본 게이트웨이로 사용:

ip -6 route show
 
# 출력:
# default via fe80::1 dev eth0 metric 1024
# 2001:db8:1234:5678::/64 dev eth0 proto kernel metric 256

총 시간: 몇 초.

프라이버시 확장 (RFC 4941):

MAC 파생 인터페이스 ID는 네트워크 간에 추적 가능합니다. 프라이버시 확장은 주기적으로 변경되는 무작위 IID를 생성합니다.

원본: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890  (정적)
프라이버시:  2001:db8:1234:5678:1a2b:3c4d:5e6f:7a8b  (매일 변경)

대부분의 최신 OS는 수신 연결을 위해 안정적인 주소를 유지하면서 나가는 연결에 대해 기본적으로 프라이버시 확장을 활성화합니다.

보안 고려 사항#

NDP는 신뢰할 수 있는 로컬 네트워크를 가정하여 설계되었기 때문에 취약점이 있습니다. 동일한 링크의 공격자는 다음을 수행할 수 있습니다:

악의적인 라우터 광고#

공격자가 다음과 같은 가짜 RA를 보냅니다:

  • 잘못된 접두사 (트래픽 블랙홀 또는 공격자를 통해 라우팅)
  • 짧은 수명 (빈번한 RA 처리 강제로 DoS)
  • M=1 플래그 (공격자의 서버로 DHCPv6 강제)

영향: 호스트 구성에 대한 완전한 제어.

완화:

  • RA Guard: 라우터가 아닌 포트에서 RA를 차단하는 스위치 기능
  • SEND (보안 이웃 탐색): 암호화 인증 (복잡, 거의 배포되지 않음)
  • 라우터 선호도: 합법적인 라우터에 높은 선호도 값 사용

이웃 광고 스푸핑#

공격자가 다른 호스트인 척하는 가짜 NA를 보냅니다.

영향: 중간자 공격, 트래픽 가로채기.

완화:

  • SEND: NA 인증
  • 포트 보안: 스위치가 MAC 주소 바인딩 적용
  • 모니터링: 중복 MAC 주소 감지

DAD DoS#

공격자가 모든 DAD 요청에 응답하여 주소 구성을 방지합니다.

영향: 호스트가 주소를 얻을 수 없고 연결이 없음.

완화:

  • SEND: DAD 메시지 인증
  • 속도 제한: 단일 소스의 NA 제한
  • 정적 주소: SLAAC를 완전히 우회 (확장 불가능)

리디렉션 공격#

공격자가 공격자를 통해 트래픽을 라우팅하는 가짜 리디렉션을 보냅니다.

영향: 중간자, 트래픽 가로채기.

완화:

  • 리디렉션 비활성화: 많은 OS가 리디렉션 처리를 비활성화할 수 있음
  • SEND: 리디렉션 인증
  • 소스 확인: 호스트가 현재 첫 번째 홉 라우터에서 리디렉션이 오는지 확인해야 함

현실: 복잡성으로 인해 대부분의 네트워크는 SEND를 사용하지 않습니다. 스위치의 RA Guard가 기업 네트워크의 실용적인 방어입니다.

NDP 문제 해결#

호스트에 전역 주소 없음#

증상:

  • fe80:: 주소만
  • 링크 로컬은 ping 가능하지만 전역은 불가능
  • 기본 경로 없음

진단:

# 라우터 광고 확인
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
 
# RA 수락 확인
sysctl net.ipv6.conf.eth0.accept_ra
# 호스트의 경우 1 또는 2여야 함
 
# 수동으로 RS 전송
rdisc6 eth0

일반적인 원인:

  • 링크에 라우터 없음
  • 유형 134를 차단하는 방화벽
  • accept_ra 비활성화
  • IPv6 전달 활성화됨 (RA 처리 비활성화)

수정: 라우터 활성화, ICMPv6 유형 134 허용, accept_ra=1 설정.

이웃 캐시가 항상 FAILED#

증상:

  • 이웃에 도달할 수 없음
  • NS 전송되었지만 NA 수신되지 않음
  • 이웃 캐시가 FAILED 표시

진단:

# NS/NA 교환 관찰
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
 
# 이웃 캐시 확인
ip -6 neigh show
 
# 수동 NS (Linux ndisc6 도구)
ndisc6 2001:db8::10 eth0

일반적인 원인:

  • 유형 135/136을 차단하는 방화벽
  • 대상 호스트 IPv6 비활성화
  • 멀티캐스트를 필터링하는 스위치
  • 잘못된 링크 (대상이 다른 서브넷에 있음)

수정: 방화벽을 통해 NDP 허용, 대상에서 IPv6 활성화 확인.

DAD 실패#

증상:

  • 주소가 「dadfailed」표시
  • 인터페이스가 주소를 구성할 수 없음
  • 커널 로그에 DAD 충돌 표시

진단:

# 주소 상태 확인
ip -6 addr show eth0
 
# DAD 실패가 있는 예시 출력:
# inet6 2001:db8::10/64 scope global tentative dadfailed
 
# 중복 확인
ping6 -c 1 2001:db8::10

일반적인 원인:

  • 동일한 주소를 사용하는 다른 호스트
  • NA를 스푸핑하는 공격자 (DAD DoS)
  • 복제된 MAC 주소가 있는 가상 머신

수정: 주소 변경, 중복 호스트 조사, VM 구성 확인.

도구를 사용한 실제 예시#

tcpdump로 NDP 모니터링#

# 모든 NDP 트래픽
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] >= 133 && ip6[40] <= 137'
 
# 라우터 광고만
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
 
# 주소 확인 (NS/NA)
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
 
# 대상 주소로 필터링
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 135' | grep '2001:db8::10'

수동 이웃 캐시 관리#

# 모든 이웃 표시
ip -6 neigh show
 
# 특정 이웃 표시
ip -6 neigh show 2001:db8::10
 
# 항목 삭제 (재확인 강제)
sudo ip -6 neigh del 2001:db8::10 dev eth0
 
# 정적 항목 추가
sudo ip -6 neigh add 2001:db8::10 lladdr aa:bb:cc:dd:ee:ff dev eth0

SLAAC 테스트#

# 주소 플러시
sudo ip -6 addr flush dev eth0
 
# IPv6 재활성화
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
 
# 자동 구성 관찰
ip -6 addr show eth0
ip -6 route show

관련 문서#

  • ICMPv6 설명 - NDP는 ICMPv6를 통해 실행됩니다. 기본 프로토콜을 이해합니다.
  • IPv6 주소 유형 - NDP에서 사용하는 링크 로컬, 요청된 노드 멀티캐스트 및 기타 주소 유형에 대해 알아봅니다.
  • IPv6 보안 - 필수 기능을 허용하면서 NDP를 공격으로부터 보호합니다.

실제 NDP 테스트

Ping 도구를 사용하여 주소 확인을 트리거하고 Traceroute를 사용하여 호스트가 다음 홉 라우터를 탐색하는 방법을 확인합니다.

자주 묻는 질문#

NDP가 ARP처럼 브로드캐스트 대신 멀티캐스트를 사용하는 이유는 무엇입니까?

멀티캐스트가 더 효율적입니다. ARP 브로드캐스트는 네트워크의 모든 호스트에 도달합니다—대상이 아니더라도 모두 프레임을 처리해야 합니다. NDP는 대상의 IPv6 주소에서 계산된 요청된 노드 멀티캐스트 주소를 사용합니다. 일치하는 주소를 가진 호스트만 해당 멀티캐스트 그룹에 가입하고 패킷을 수신합니다. 호스트는 하드웨어(NIC)에서 일치하지 않는 멀티캐스트를 필터링하여 CPU 부하를 줄입니다. 수천 개의 호스트가 있는 대규모 네트워크에서 이것은 상당한 성능 차이를 만듭니다.

ARP를 비활성화하는 것처럼 NDP를 비활성화할 수 있습니까?

아니요. NDP는 IPv6 작동에 필수적입니다. 주소 확인, 라우터 탐색 및 자동 구성을 처리합니다. NDP를 비활성화하면 IPv6가 완전히 작동하지 않습니다. 정적 ARP 항목을 사용할 수 있는 IPv4와 달리 IPv6는 라우터 광고에 대한 NDP가 필요합니다(기본 게이트웨이와 접두사를 제공함). 정적 이웃이 있더라도 라우터를 학습하거나 주소를 자동 구성할 방법이 없습니다.

중복 주소 감지는 어떻게 충돌을 방지합니까?

주소를 사용하기 전에 호스트는 소스 주소 :: (지정되지 않음), 대상을 사용하려는 주소로 설정한 이웃 요청을 보냅니다. 다른 호스트가 이미 해당 주소를 사용하는 경우 이웃 광고로 응답합니다. 요청 호스트가 응답을 보고 충돌을 감지하여 다른 주소를 선택해야 합니다. 약 1초 이내에 응답이 도착하지 않으면 주소가 고유한 것으로 간주됩니다. DAD는 링크 로컬 주소와 전역 주소 모두에 대해 실행됩니다.

요청된 노드 멀티캐스트 주소는 무엇입니까?

요청된 노드 멀티캐스트 주소는 ff02::1:ff:XX:XXXX 공식을 사용하여 IPv6 주소의 마지막 24비트에서 파생됩니다. 모든 IPv6 주소는 해당 요청된 노드 멀티캐스트 그룹에 자동으로 가입합니다. 주소 확인을 수행할 때 발신자는 브로드캐스트 대신 요청된 노드 주소로 NS를 보냅니다. 동일한 24비트로 끝나는 주소를 가진 호스트만 수신합니다. 이렇게 하면 브로드캐스트 기반 ARP에 비해 불필요한 처리가 줄어듭니다.

NDP 패킷의 홉 제한이 255여야 하는 이유는 무엇입니까?

보안. 합법적인 NDP는 항상 로컬 링크에서 시작되며 홉 제한을 255로 설정합니다. 라우터는 전달할 때 홉 제한을 감소시키므로 원격 공격자의 패킷은 홉 제한 < 255로 도착합니다. 홉 제한 != 255인 NDP 패킷을 거부함으로써 호스트는 복잡한 인증 없이 스푸핑된 라우터 광고, 이웃 광고 또는 리디렉션을 보내는 원격 공격자로부터 보호합니다. 이 간단한 검사는 많은 원격 공격을 방지합니다.

SEND (보안 이웃 탐색)를 배포해야 합니까?

아마도 아닙니다. SEND는 공개 키 암호화를 사용하여 NDP에 대한 암호화 인증을 제공하여 스푸핑 공격을 방지합니다. 이론적으로는 훌륭합니다. 실제로는 복잡하고 PKI 인프라가 필요하며 OS 지원이 부족하고 주소 확인과 같은 시간에 민감한 작업에 대기 시간을 추가합니다. 대부분의 네트워크는 더 간단한 완화를 사용합니다: 스위치의 RA Guard(라우터가 아닌 포트에서 RA 차단), 악의적인 RA 모니터링 및 물리적/링크 계층 보안. SEND는 인프라와 복잡성에 기꺼이 투자하는 높은 보안 환경에 적합합니다.