4장 : IP 주소와 서브넷
IPv6
NAT가 IPv4의 주소 부족 문제를 임시로 해결해 주었지만, 근본적인 한계는 변하지 않습니다. 개, 약 43억 개의 IPv4 주소는 이미 거의 모두 할당되었습니다. 스마트폰, IoT 기기, 클라우드 인스턴스가 폭발적으로 늘어나는 시대에 43억 개는 턱없이 부족합니다.
이 문제에 대한 근본적인 답이 IPv6입니다.
IPv4 고갈 타임라인
| 연도 | 사건 |
|---|---|
| 2011 | IANA 마지막 /8 블록 할당 완료 |
| 2011 | APNIC (아시아) 일반 할당 중단 |
| 2012 | RIPE (유럽) 마지막 /8 진입 |
| 2014 | LACNIC (남미) 마지막 /10 진입 |
| 2015 | ARIN (북미) IPv4 완전 고갈 |
| 2017 | AfriNIC (아프리카) 마지막 블록 |
| 현재 | IPv4 이전/거래 시장과 CGNAT로 수요 보완 |
NAT로 연명해 왔지만, NAT의 한계는 분명합니다. 엔드투엔드 연결이 깨져 P2P 통신이 어렵고, NAT 테이블 관리에 오버헤드가 발생하며, 특정 프로토콜은 NAT 환경에서 정상 동작하지 않습니다.
IPv6 주소 구조
IPv6 주소는 128비트로 구성됩니다. 개의 주소를 제공합니다. 표기는 16비트씩 8개 그룹으로 나누고, 각 그룹은 16진수로 적습니다.
IPv4 vs IPv6 비교
| 항목 | IPv4 | IPv6 |
|---|---|---|
| 주소 길이 | 32비트 | 128비트 |
| 주소 수 | ~43억 | ~ |
| 표기법 | 점 십진 (192.168.1.1) | 콜론 16진수 (2001:db8::1) |
| 헤더 크기 | 20~60 바이트 (가변) | 40 바이트 (고정) |
| 체크섬 | 있음 | 없음 (L4에 위임) |
| NAT 필요 | 주소 공유 목적으로 널리 사용 | 주소 부족 완화 목적 NAT 필요성 낮음 |
| 보안 확장 | 별도 프로토콜로 사용 | 인증/무결성/암호화 확장 지원 |
| 브로드캐스트 | 있음 | 없음 (멀티캐스트로 대체) |
| 자동 구성 | DHCP 필요 | SLAAC 가능 |
| 단편화 | 라우터 + 호스트 | 송신 호스트만 (라우터 X) |
IPv6 주소 유형
| 유형 | 프리픽스 | 용도 |
|---|---|---|
| 글로벌 유니캐스트 | 2000::/3 | 공인 IP (인터넷 라우팅 가능) |
| 링크 로컬 | fe80::/10 | 같은 링크 내 통신 (자동 생성) |
| 유니크 로컬 | fc00::/7 | IPv4 사설 IP와 유사 |
| 멀티캐스트 | ff00::/8 | 그룹 통신 |
| 루프백 | ::1 | IPv4의 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/DNS64 | IPv6 ↔ IPv4 변환 게이트웨이 | IPv6-only 가능 | 변환 지연, 복잡성 |
개발자가 IPv6를 고려해야 하는 시점
"""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 리스너 설정 |
| 클라우드 VPC | IPv6 CIDR 블록 할당 |
| 로그 파싱 | IPv6 주소 형식 파싱 가능한지 |
# 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 주소를 기반으로 패킷이 네트워크를 횡단하며 목적지에 도달하는 과정, 라우팅을 살펴보겠습니다.