안동민 개발노트

본문 시작

IPv6

IPv6의 128비트 주소 표기·주소 유형·간소화된 헤더를 익히고 듀얼 스택·터널링·변환 전환 전략을 비교합니다.

NAT가 IPv4의 주소 부족 문제를 임시로 해결해 주었지만, 근본적인 한계는 변하지 않습니다.

2322^{32}개, 약 43억 개의 IPv4 주소는 이미 거의 모두 할당되었습니다.

스마트폰, IoT 기기, 클라우드 인스턴스가 폭발적으로 늘어나는 시대에 43억 개는 턱없이 부족합니다.

이 문제에 대한 근본적인 답이 IPv6입니다.


IPv4 고갈 타임라인

연도사건
2011IANA 마지막 /8 블록 할당 완료
2011APNIC (아시아) 일반 할당 중단
2012RIPE (유럽) 마지막 /8 진입
2014LACNIC (남미) 마지막 /10 진입
2015ARIN (북미) 일반 IPv4 미할당 풀 고갈
2017AFRINIC (아프리카) 마지막 /8의 제한 할당 단계 진입
현재IPv4 이전/거래 시장과 CGNAT로 수요 보완

NAT로 연명해 왔지만, NAT의 한계는 분명합니다.

엔드투엔드 연결이 깨져 P2P 통신이 어렵고, NAT 테이블 관리에 오버헤드가 발생하며, 특정 프로토콜은 NAT 환경에서 정상 동작하지 않습니다.


IPv6 주소 구조

IPv6 주소는 128비트로 구성됩니다.

2128≈3.4×10382^{128} \approx 3.4 \times 10^{38}개의 주소를 제공합니다.

표기는 16비트씩 8개 그룹으로 나누고, 각 그룹은 16진수로 적습니다. 그룹 앞의 0을 생략할 수 있고 연속된 0 그룹은 주소 하나에서 한 번만 ::로 줄일 수 있습니다.

같은 IPv6 주소의 전체 표기와 압축 표기

세 표기는 같은 128비트 주소입니다. ::는 한 주소에 한 번만 사용하여 생략한 0 그룹의 개수가 정해지도록 합니다.

같은 IPv6 주소의 전체 표기와 압축 표기
표기 단계주소
8개 그룹 전체2001:0db8:0001:0000:0000:0000:0000:0001
그룹 앞의 0 생략2001:db8:1:0:0:0:0:1
연속된 0 그룹 압축2001:db8:1::1
복원 시 채우는 그룹보이는 4개 그룹 + :: 위치의 0000 네 그룹 = 8개
8개 그룹 전체
주소: 2001:0db8:0001:0000:0000:0000:0000:0001
그룹 앞의 0 생략
주소: 2001:db8:1:0:0:0:0:1
연속된 0 그룹 압축
주소: 2001:db8:1::1
복원 시 채우는 그룹
주소: 보이는 4개 그룹 + :: 위치의 0000 네 그룹 = 8개

IPv4 vs IPv6 비교

비교IPv4와 IPv6
주소IPv4: 32비트·약 43억 개·점 십진 표기 / IPv6: 128비트·약 3.4×10³⁸개·콜론 16진 표기
기본 헤더IPv4: 20~60 B / IPv6: 40 B 고정, 확장 헤더 길이는 별도
헤더 체크섬IPv4에는 있음 / IPv6 기본 헤더에는 없음; 링크·상위 계층의 검사는 별도
주소 공유IPv4는 NAT를 널리 사용 / IPv6는 주소 부족 완화 목적의 NAT 필요성이 낮음
보안IPsec 등 인증·무결성·암호화 기술을 둘 다 사용 가능; IPv6만으로 암호화되지 않음
그룹 전달IPv4는 브로드캐스트 지원 / IPv6는 브로드캐스트 없이 멀티캐스트 등 사용
자동 구성IPv4는 DHCP·링크 로컬 등 / IPv6는 SLAAC·DHCPv6 등
단편화IPv4는 조건에 따라 라우터도 수행 / IPv6는 송신 호스트만 수행

IPv6 주소 유형

주소 유형범위와 용도
글로벌 유니캐스트2000::/3은 대표적인 전역 할당 범위 · 실제 인터넷 도달성은 라우팅·정책에 의존
링크 로컬fe80::/10 · 같은 링크 안의 통신
유니크 로컬fc00::/7 · 로컬 통신용, 일반적인 자체 생성 주소는 fd00::/8
멀티캐스트ff00::/8 · 그룹 통신
루프백::1 · 자기 자신
미지정:: · 아직 주소가 정해지지 않은 상태 등

SLAAC (Stateless Address Autoconfiguration)

IPv6에서는 DHCP 없이도 자동으로 IP를 설정할 수 있습니다.

SLAAC은 링크 로컬 주소 생성, 중복 주소 탐지(DAD), 라우터 광고(RA) 수신, 글로벌 주소 생성 순서로 이해하면 됩니다.

RA 프리픽스가 자동 구성에 적합하고 수명·플래그 등 조건을 충족해야 하며, 새 글로벌 주소에도 DAD를 적용합니다. 인터페이스 ID는 MAC을 노출하지 않는 방식이 권고됩니다.

관리자가 주소를 더 엄격하게 통제해야 하는 환경에서는 DHCPv6와 함께 쓰기도 합니다.

SLAAC 과정
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 장치가 링크 로컬 주소 자동 생성
   fe80::인터페이스ID (MAC 주소 기반일 필요 없음)

2. DAD(Duplicate Address Detection)
   이 주소를 다른 장치가 쓰고 있는지 확인

3. Router Solicitation 전송
   "라우터야, 네트워크 프리픽스 알려줘"

4. Router Advertisement 수신
   프리픽스: 2001:db8:1::/64

5. 글로벌 주소 생성
   2001:db8:1::인터페이스ID
   (불투명한 안정 ID나 임시 ID 등; MAC 기반 ID는 필수 아님)

IPv6 헤더

IPv4 대비 단순화된 점: 기본 헤더 체크섬 제거, 옵션 성격의 정보를 확장 헤더로 분리, 기본 헤더를 40바이트 고정 크기로 유지.

확장 헤더는 Next Header 값으로 체인처럼 이어집니다.

기본 헤더 필드비트 수와 역할
Version4 · IPv6는 6
Traffic Class · Flow Label8 · 트래픽 분류 / 20 · 흐름 식별
Payload Length16 · 기본 헤더 뒤 페이로드 길이
Next Header8 · 다음 확장 헤더 또는 상위 프로토콜
Hop Limit8 · 라우터 전달 횟수 제한
출발지·목적지 주소각 128 · 통신 끝점 주소

IPv4에서 IPv6로의 전환 전략

전환 전략동작과 비용
듀얼 스택IPv4·IPv6 동시 지원 · 직관적이나 두 스택 운영 필요
터널링다른 IP 패킷 안에 캡슐화 · 점진적 전환이 가능하나 오버헤드·MTU 감소
NAT64/DNS64IPv6 전용 클라이언트의 IPv4 서비스 접근 지원 · 변환과 DNS 구성의 제약 관리

개발자가 IPv6를 고려해야 하는 시점

아래 코드는 소켓 바인딩·리스닝까지만 보여 줍니다. accept()와 HTTP 응답 처리가 없으므로 출력된 URL에 웹 서비스를 제공하는 예제가 아닙니다. IPV6_V6ONLY=0의 듀얼 스택 지원 여부도 운영체제에 따라 확인해야 합니다.

ipv6_socket.py
"""IPv6 대응 서버 소켓 예시"""
import socket

# IPv4 전용 (문제가 될 수 있음)
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# sock.bind(("0.0.0.0", 8080))

# IPv6 + IPv4 듀얼 스택 (권장)
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
sock.bind(("::", 8080))  # :: = 모든 IPv6 + IPv4 인터페이스
sock.listen(5)

print("듀얼 스택 서버 시작 (IPv4 + IPv6)")
print("IPv4: http://127.0.0.1:8080")
print("IPv6: http://[::1]:8080")
체크리스트확인 사항
DB 스키마순수 16진 IPv6는 최대 39자, IPv4 혼합 표기는 최대 45자. 영역 식별자(%eth0 등)도 저장하면 추가 길이 필요
유효성 검증IPv6 형식도 검증하는지
서버 바인딩:: 또는 듀얼 스택 바인딩
로드 밸런서IPv6 리스너 설정
클라우드 VPCIPv6 CIDR 블록 할당
로그 파싱IPv6 주소 형식 파싱 가능한지
ipv6_check.sh
# IPv6 주소 확인
ip -6 addr show

# IPv6 연결 테스트
ping6 ::1                    # 루프백
ping6 google.com             # 외부 IPv6

# IPv6 라우팅 테이블
ip -6 route show

# IPv6 이웃 테이블 (NDP, ARP의 IPv6 버전)
ip -6 neigh show

# 사이트의 IPv6 지원 확인
dig AAAA google.com
curl -6 https://ipv6.google.com

다음 장에서는 IP 주소를 기반으로 패킷이 네트워크를 횡단하며 목적지에 도달하는 과정, 라우팅을 살펴보겠습니다.