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 (아프리카) 마지막 블록 |
| 현재 | 중고 IP 시장(IPv4 거래), $40~60/IP |
NAT로 연명해 왔지만, NAT의 한계는 분명합니다. 엔드투엔드 연결이 깨져 P2P 통신이 어렵고, NAT 테이블 관리에 오버헤드가 발생하며, 특정 프로토콜은 NAT 환경에서 정상 동작하지 않습니다.
IPv6 주소 구조
IPv6 주소는 128비트로 구성됩니다. 개의 주소를 제공합니다.
IPv6 주소 구조
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
전체 표기
2001:0db8:85a3:0000:0000:8a2e:0370:7334
└──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘
16b 16b 16b 16b 16b 16b 16b 16b
├─── 8개 그룹 × 16비트 = 128비트 ────────┤
축약 규칙
1. 선행 0 생략: 0db8 → db8, 0370 → 370
2. 연속 0 그룹 :: 축약 (1회만):
2001:0db8:0000:0000:0000:0000:0000:0001
→ 2001:db8::1
일반 주소 구조
┌──────────────────┬──────────────────┐
│ 네트워크 프리픽스│ 인터페이스 ID │
│ (64비트) │ (64비트) │
└──────────────────┴──────────────────┘
라우팅에 사용 호스트 식별
ISP/기관 할당 EUI-64 또는 랜덤IPv4 vs IPv6 비교
| 항목 | IPv4 | IPv6 |
|---|---|---|
| 주소 길이 | 32비트 | 128비트 |
| 주소 수 | ~43억 | ~ |
| 표기법 | 점 십진 (192.168.1.1) | 콜론 16진수 (2001:db8::1) |
| 헤더 크기 | 20~60 바이트 (가변) | 40 바이트 (고정) |
| 체크섬 | 있음 | 없음 (L4에 위임) |
| NAT 필요 | 거의 필수 | 불필요 |
| IPsec | 선택 | 기본 내장 |
| 브로드캐스트 | 있음 | 없음 (멀티캐스트로 대체) |
| 자동 구성 | 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 과정
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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 헤더
IPv6 헤더 구조 (고정 40바이트)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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
├───────┬───────────────┬───────────────────────────────────────┤
│Version│ Traffic Class │ Flow Label │
│ (6) │ (8비트) │ (20비트) │
├───────┴───────────────┼───────────────┬───────────────────────┤
│ Payload Length │ Next Header │ Hop Limit │
│ (16비트) │ (8비트) │ (8비트) │
├───────────────────────┴───────────────┴───────────────────────┤
│ │
│ Source Address (128비트) │
│ │
├───────────────────────────────────────────────────────────────┤
│ │
│ Destination Address (128비트) │
│ │
└───────────────────────────────────────────────────────────────┘IPv4 대비 단순화된 점: 체크섬 제거(L2/L4에서 처리), 옵션 필드를 확장 헤더로 분리, 고정 크기로 라우터 처리 효율 향상.
IPv4에서 IPv6로의 전환 전략
| 전략 | 원리 | 장점 | 단점 |
|---|---|---|---|
| 듀얼 스택 | 장치가 IPv4/IPv6 동시 지원 | 가장 직관적 | 두 스택 관리 부담 |
| 터널링 | IPv6를 IPv4 안에 캡슐화 | 점진적 전환 | 오버헤드, MTU 감소 |
| NAT64/DNS64 | IPv6 ↔ IPv4 변환 게이트웨이 | IPv6-only 가능 | 변환 지연, 복잡성 |
터널링 (6in4)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[IPv6 호스트] ──→ [터널 입구] ──→ [IPv4 네트워크] ──→ [터널 출구] ──→ [IPv6 호스트]
IPv6 패킷을 IPv4로 감싸서 IPv4 벗기고
IPv4로 감싸기 전송 IPv6 복원개발자가 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 주소를 기반으로 패킷이 네트워크를 횡단하며 목적지에 도달하는 과정, 라우팅을 살펴보겠습니다.