IPv6 SLAAC: 상태 비저장 주소 자동 구성

IPv6 SLAAC의 동작 과정, EUI-64 인터페이스 ID 생성, DAD, RA/RS, Privacy Extensions를 완전히 설명합니다.

· 5 min read · PALDYN Team

지난 글에서 브로드캐스트·멀티캐스트·애니캐스트 전송 방식을 살펴봤다. 이번 글에서는 IPv6의 핵심 기능 중 하나인 SLAAC(Stateless Address Autoconfiguration)을 다룬다. DHCP 서버 없이 호스트 스스로 전역 IPv6 주소를 생성하는 메커니즘이다.

SLAAC이란?

SLAAC(RFC 4862)는 IPv6 호스트가 라우터의 광고(RA)와 자신의 인터페이스 식별자를 결합해 전역 유니캐스트 주소를 자동으로 구성하는 방식이다. 상태 비저장(stateless)이므로 서버가 주소 할당 기록을 유지할 필요가 없다.

SLAAC 동작 과정

IPv6 SLAAC 주소 자동 구성 과정

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

부팅 직후 호스트는 fe80::/10 프리픽스와 인터페이스 ID를 합쳐 링크 로컬 주소를 만든다. 이 주소는 같은 링크(세그먼트) 안에서만 유효하다.

# 링크 로컬 주소 확인
ip -6 addr show eth0 | grep 'scope link'
# inet6 fe80::a1b2:c3d4:e5f6:0001/64 scope link

2단계: DAD (Duplicate Address Detection)

생성한 주소가 이미 사용 중인지 확인한다. Neighbor Solicitation(NS) 메시지를 ff02::1:ffXX:XXXX (Solicited-Node 멀티캐스트)로 전송하고, 응답이 없으면 해당 주소를 사용한다.

NS: "이 주소(fe80::...)를 쓰는 노드 있습니까?"
NA: 응답 있음 → 주소 충돌, 재생성 필요
   응답 없음 → 주소 사용 가능

3단계: RS (Router Solicitation) 전송

링크 로컬 주소가 확정되면 호스트는 ff02::2(All Routers 멀티캐스트)로 RS를 전송해 라우터에게 프리픽스 정보를 요청한다.

4단계: RA (Router Advertisement) 수신

라우터가 호스트에게 다음 정보를 포함한 RA를 응답한다:

  • 프리픽스: 2001:db8::/64 같은 서브넷 프리픽스
  • 기본 게이트웨이: 라우터의 링크 로컬 주소
  • 플래그: M(Managed) - DHCPv6로 주소 받을지, O(Other) - DNS 등 기타 정보를 DHCPv6로 받을지

5·6단계: 글로벌 주소 생성 및 DAD

호스트는 RA의 프리픽스(64비트)와 인터페이스 ID(64비트)를 합쳐 글로벌 유니캐스트 주소를 만들고, 다시 DAD로 중복을 확인한다.

EUI-64: 인터페이스 ID 생성

EUI-64 MAC에서 IPv6 인터페이스 ID 변환

EUI-64 방식은 48비트 MAC 주소를 64비트 인터페이스 ID로 변환한다:

  1. MAC 주소 3바이트 OUI + 3바이트 NIC 사이에 FF:FE 삽입 (48 → 64비트)
  2. OUI의 7번째 비트(U/L 비트, Universal/Local)를 반전
def mac_to_eui64(mac: str) -> str:
    parts = mac.split(':')
    # FF:FE 삽입
    parts = parts[:3] + ['ff', 'fe'] + parts[3:]
    # 7번째 비트 반전 (첫 바이트 XOR 0x02)
    parts[0] = format(int(parts[0], 16) ^ 0x02, '02x')
    # 16비트 그룹으로 묶기
    return ':'.join(''.join(parts[i:i+2]) for i in range(0, 8, 2))

print(mac_to_eui64("00:1a:2b:3c:4d:5e"))
# → 021a:2bff:fe3c:4d5e

Privacy Extensions (RFC 4941)

EUI-64는 MAC 주소를 직접 노출하므로 사용자 추적이 가능하다. 현대 OS는 Privacy Extensions를 기본 활성화해 임의 인터페이스 ID를 주기적으로 갱신한다.

# Linux에서 Privacy Extensions 확인
cat /proc/sys/net/ipv6/conf/eth0/use_tempaddr
# 2 = 임시 주소 생성(권장), 0 = 비활성

RA 플래그와 DHCPv6 연동

RA에는 두 개의 핵심 플래그가 있다:

플래그의미동작
M=0, O=0순수 SLAAC주소 + DNS 모두 RA에서 획득
M=0, O=1SLAAC + Stateless DHCPv6주소는 SLAAC, DNS 등은 DHCPv6
M=1Stateful DHCPv6주소 자체를 DHCPv6에서 할당
# radvd.conf (Linux 라우터 설정 예시)
interface eth0 {
    AdvSendAdvert on;
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    AdvManagedFlag off;    # M=0: SLAAC 사용
    AdvOtherConfigFlag on; # O=1: DNS는 DHCPv6
    prefix 2001:db8::/64 {
        AdvOnLink on;
        AdvAutonomous on;  # SLAAC 허용
    };
};

SLAAC은 서버가 없어도 되는 단순함이 장점이지만, 특정 IP를 특정 호스트에 고정 할당하려면 Stateful DHCPv6가 필요하다.


지난 글: 브로드캐스트·멀티캐스트·애니캐스트: IP 전송 방식 완전 정리

다음 글: 라우팅 기초: 패킷이 목적지를 찾아가는 방법


읽어주셔서 감사합니다. 😊