안동민 개발노트 아이콘

안동민 개발노트

4장 : IP 주소와 서브넷

IPv6

NAT가 IPv4의 주소 부족 문제를 임시로 해결해 주었지만, 근본적인 한계는 변하지 않습니다. 2322^{32}개, 약 43억 개의 IPv4 주소는 이미 거의 모두 할당되었습니다. 스마트폰, IoT 기기, 클라우드 인스턴스가 폭발적으로 늘어나는 시대에 43억 개는 턱없이 부족합니다.

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


IPv4 고갈 타임라인

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

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


IPv6 주소 구조

IPv6 주소는 128비트로 구성됩니다. 21283.4×10382^{128} \approx 3.4 \times 10^{38}개의 주소를 제공합니다. 표기는 16비트씩 8개 그룹으로 나누고, 각 그룹은 16진수로 적습니다.


IPv4 vs IPv6 비교

항목IPv4IPv6
주소 길이32비트128비트
주소 수~43억~3.4×10383.4 \times 10^{38}
표기법점 십진 (192.168.1.1)콜론 16진수 (2001:db8::1)
헤더 크기20~60 바이트 (가변)40 바이트 (고정)
체크섬있음없음 (L4에 위임)
NAT 필요주소 공유 목적으로 널리 사용주소 부족 완화 목적 NAT 필요성 낮음
보안 확장별도 프로토콜로 사용인증/무결성/암호화 확장 지원
브로드캐스트있음없음 (멀티캐스트로 대체)
자동 구성DHCP 필요SLAAC 가능
단편화라우터 + 호스트송신 호스트만 (라우터 X)

IPv6 주소 유형

유형프리픽스용도
글로벌 유니캐스트2000::/3공인 IP (인터넷 라우팅 가능)
링크 로컬fe80::/10같은 링크 내 통신 (자동 생성)
유니크 로컬fc00::/7IPv4 사설 IP와 유사
멀티캐스트ff00::/8그룹 통신
루프백::1IPv4의 127.0.0.1에 해당
미지정::IPv4의 0.0.0.0에 해당

SLAAC (Stateless Address Autoconfiguration)

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

SLAAC은 링크 로컬 주소 생성, 중복 주소 탐지(DAD), 라우터 광고(RA) 수신, 글로벌 주소 생성 순서로 이해하면 됩니다. 관리자가 주소를 더 엄격하게 통제해야 하는 환경에서는 DHCPv6와 함께 쓰기도 합니다.

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

1. 장치가 링크 로컬 주소 자동 생성
   fe80::MAC주소기반

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

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

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

5. 글로벌 주소 생성
   2001:db8:1::인터페이스ID
   (MAC 기반 EUI-64 또는 Privacy Extension 랜덤)

IPv6 헤더

IPv4 대비 단순화된 점: 기본 헤더 체크섬 제거, 옵션 성격의 정보를 확장 헤더로 분리, 기본 헤더를 40바이트 고정 크기로 유지. 확장 헤더는 Next Header 값으로 체인처럼 이어집니다.


IPv4에서 IPv6로의 전환 전략

전략원리장점단점
듀얼 스택장치가 IPv4/IPv6 동시 지원가장 직관적두 스택 관리 부담
터널링IPv6를 IPv4 안에 캡슐화점진적 전환오버헤드, MTU 감소
NAT64/DNS64IPv6 ↔ IPv4 변환 게이트웨이IPv6-only 가능변환 지연, 복잡성

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

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 스키마IP 컬럼이 VARCHAR(45) 이상인지 (IPv6 최대 39자 + 여유)
유효성 검증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 주소를 기반으로 패킷이 네트워크를 횡단하며 목적지에 도달하는 과정, 라우팅을 살펴보겠습니다.