콘텐츠로 이동

WireGuard vs IPIP 차이점 정리

IPIP와 WireGuard의 캡슐화와 암호화 원리를 비교표로 정리했다. WireGuard는 공개키로 서로를 확인하고 그 키가 패킷을 어느 상대에게 보낼지 정하는 주소 역할까지 하는데 이 구조가 IPIP와 어디서 갈리는지 풀어서 다룬다.

터널링이란

터널링(Tunneling)이란 원본 패킷을 다른 헤더로 한 번 더 감싸(캡슐화) 중간 경로가 이해하는 주소로 실어 나르는 기술

  • 목적: 언더레이가 직접 라우팅하지 못하는 주소·대역을 우회 전달
  • 구조: 바깥 헤더(전달용) + 안쪽 원본 패킷(페이로드)로 이중 포장
  • 대가: 헤더가 덧붙어 유효 MTU 감소, 캡슐·역캡슐 처리 비용 발생
  • 갈림: 무엇으로 감싸는지, 암호화 여부를 두는지로 프로토콜이 나뉨

IPIP와 WireGuard는 둘 다 "패킷을 패킷에 싸서 나른다"는 점은 같지만, 하나는 최소한으로 싸기만 하고 다른 하나는 싸면서 암호화까지 한다는 데서 성격이 갈림.


IPIP 정리

IPIP(IP-in-IP)란 IPv4 패킷 앞에 바깥 IPv4 헤더 하나만 덧붙이는 가장 단순한 캡슐화 방식(RFC 2003)

  • 오버헤드: 바깥 IP 헤더 20B만 추가 → 캡슐화 방식 중 최소
  • 표시: 바깥 헤더의 프로토콜 번호를 4로 세팅 → 페이로드가 또 다른 IP 패킷임을 명시
  • 보안: 자체 암호화·인증 없음 → 페이로드가 평문 그대로 노출
  • 제약: IPv4 유니캐스트 전용, 멀티캐스트·브로드캐스트·IPv6 미지원(멀티캐스트가 필요하면 GRE로 대체)
  • 폴백: ipip 모듈 적재 시 커널이 tunl0 기본 디바이스 생성, 매칭되는 터널이 없으면 이 장치가 처리
  • 상태: 세션·핸드셰이크 개념이 없는 단순 스테이트리스 캡슐화

바깥 헤더를 벗기면 원본 IP 패킷이 그대로 나오므로, 신뢰된 경로에서 라우팅만 우회시키는 용도에 맞음. 반대로 경로가 신뢰되지 않으면 페이로드가 통째로 도청 가능.

IPIP 사용처

  • 사설망 내부에서 서로 라우팅되지 않는 서브넷을 연결
  • Calico IPIP 모드: 언더레이가 파드 CIDR을 라우팅하지 못할 때 파드 트래픽을 IPIP로 오버레이
  • Calico는 IPIP 라우트를 BGP로 노드 간 분배(VXLAN 모드는 BGP를 쓰지 않는 것과 대비)
  • CrossSubnet 옵션: 같은 서브넷 안은 비캡슐화, 서브넷 경계를 넘는 트래픽만 IPIP로 감싸 오버헤드 절감

IPIP 구성 예

# ipip 모듈 적재
modprobe ipip

# 양쪽 노드에 터널 생성, local/remote는 물리 인터페이스 IP
ip tunnel add tun0 mode ipip local 10.0.1.1 remote 10.0.2.1
ip addr add 192.168.100.1/30 dev tun0   # 터널 내부 대역
ip link set tun0 up
  • 키·인증서·핸드셰이크 항목이 전혀 없음 → 양쪽 물리 IP만 맞추면 즉시 통신
  • 반대편 노드도 local·remote를 뒤집어 동일하게 설정하면 대칭 터널 완성

WireGuard 정리

WireGuard란 Noise 프로토콜 프레임워크의 Noise_IK 핸드셰이크로 피어를 인증하고, 모든 트래픽을 UDP로 캡슐화해 암호화하는 커널 내장 VPN 터널

  • 핸드셰이크: Noise_IK 1-RTT로 세션키 확립, 순방향 비밀성(PFS)·신원 은닉·키 훼손 위장(KCI) 회피 제공
  • 데이터: 세션은 ChaCha20-Poly1305로 암호화와 인증을 한 번에 처리(AEAD)
  • 전송: 프로토콜은 UDP 하나로 통일, 기본 리슨 포트 51820
  • 스텔스: 인증되지 않은 패킷에는 아예 응답하지 않음 → 미인증 트래픽에 상태를 만들지 않아 포트 스캔·DDoS에 강함
  • 커널: 리눅스 mainline 5.6(2020년)부터 커널에 내장, 유저스페이스 구현(wireguard-go)도 존재
  • 설정: 인터페이스 개인키 + 피어별 공개키·AllowedIPs·Endpoint만으로 동작하는 최소 구성

로밍

  • 정의: 최근 인증에 성공한 엔드포인트로 응답을 보내는 로밍(Roaming) 특성
  • 효과: 클라이언트 IP가 바뀌거나 NAT 매핑이 재바인딩돼도 재협상 없이 연결 유지
  • 활용: 모바일·NAT 뒤 노드처럼 출발지 IP가 자주 변하는 환경에 유리

cryptokey routing

공개키와 그 피어에 허용된 IP 목록(AllowedIPs)을 한 쌍으로 묶어 라우팅과 접근제어를 하나의 테이블로 합친 방식

  • 송신: 목적지 IP가 어느 피어의 AllowedIPs에 속하는지로 암호화에 쓸 공개키를 결정(라우팅 테이블 역할)
  • 수신: 복호화한 패킷의 출발지 IP가 그 피어의 AllowedIPs에 없으면 폐기(ACL 역할)
  • 효과: 키와 허용 대역이 한 곳에 묶여 방화벽 규칙과 라우팅을 따로 관리할 필요가 줄어듦

핸드셰이크 흐름

sequenceDiagram
    participant A as Peer A (Initiator)
    participant B as Peer B (Responder)
    A->>B: Handshake Initiation<br>(정적 공개키·타임스탬프 암호화 + MAC1)
    B->>A: Handshake Response<br>(ephemeral 키 교환)
    Note over A,B: Noise_IK 1-RTT → 세션키 확립 (PFS)
    A->>B: Transport Data<br>(ChaCha20-Poly1305)
    B->>A: Transport Data<br>(ChaCha20-Poly1305)
  • 개시: MAC1이 수신자 공개키로 검증되어야만 응답 → 잘못된 상대에겐 무응답
  • 확립: 두 메시지(1-RTT)만에 세션키 확보, 이후 데이터 채널로 전환
  • 갱신: 세션키는 주기적으로 재핸드셰이크되어 장기 노출 위험 축소

최소 설정 예

wg0.conf
[Interface]
PrivateKey = <자신의 개인키>
ListenPort = 51820
Address = 10.10.0.1/24

[Peer]
PublicKey = <상대 공개키>
AllowedIPs = 10.10.0.2/32
Endpoint = 203.0.113.5:51820
  • Peer 블록의 AllowedIPs가 곧 cryptokey routing 테이블 → 이 대역만 이 공개키로 오가는 것을 허용
  • Endpoint는 최초 접속용 힌트일 뿐, 이후 로밍으로 실제 엔드포인트가 갱신됨

비교표

비교 항목 IPIP WireGuard
암호화·인증 없음(평문 캡슐화) ChaCha20-Poly1305 AEAD 암호화·인증
키 관리 불필요(키 개념 없음) 피어별 공개키·개인키 쌍 배포
NAT 통과 프로토콜 4는 포트가 없어 별도 처리 필요 UDP 캡슐화 + 로밍으로 NAT 친화적
설정 복잡도 로컬·리모트 IP만 지정 인터페이스 키 + 피어 AllowedIPs (여전히 최소)
커널 지원 시점 리눅스 초기부터 내장(RFC 2003 표준) mainline 5.6(2020년)부터 내장
프로토콜/포트 IP 프로토콜 4, 포트 없음 UDP, 기본 51820
지원 트래픽 IPv4 유니캐스트 전용 IPv4·IPv6 모두
사용 사례 사설망 내부 라우팅, Calico IPIP 사이트 간 VPN, 원격 접속, 비신뢰 구간 암호화
  • 핵심 차이: IPIP는 "감싸기만", WireGuard는 "감싸면서 암호화·인증"
  • 키 관리 유무가 운영 부담과 보안 수준을 동시에 가름

함께 쓰는 경우

둘은 서로를 대체하는 관계가 아니라, 구간의 신뢰 수준에 따라 나눠 쓰는 계층 관계

  • 신뢰 구간(동일 사설망·같은 VPC 내부): IPIP로 최소 오버헤드 라우팅
  • 비신뢰 구간(퍼블릭 인터넷·데이터센터 간): WireGuard로 암호화 터널
  • 판단 기준: 경로를 도청·변조로부터 지켜야 하면 WireGuard, 이미 신뢰된 경로면 IPIP

k8s CNI에서의 위치

  • 오버레이 위치: 언더레이가 파드 CIDR을 라우팅 못 하면 IPIP·VXLAN 같은 오버레이로 노드 간 파드 트래픽을 연결
  • 암호화 위치: 노드 간 경로가 인터넷을 경유하면 그 위에 WireGuard 암호화 계층을 얹음(Calico는 파드 트래픽 WireGuard 암호화 옵션 제공)
  • 실제 분리: Calico CrossSubnet은 같은 서브넷은 비캡슐화, 서브넷 경계만 IPIP로 처리 → 신뢰/비신뢰 구간 구분의 구현 예

선택 가이드

상황 추천 사유
신뢰된 사설망 서브넷 연결 IPIP 오버헤드 최소, 키 관리 불필요
인터넷 경유 사이트 간 연결 WireGuard 도청·변조 방지 필요
NAT 뒤 모바일·원격 접속 WireGuard UDP 캡슐화 + 로밍으로 IP 변경에 강함
멀티캐스트가 필요한 L3 터널 GRE IPIP는 유니캐스트 전용이라 부적합
k8s 파드 오버레이(신뢰 언더레이) IPIP CrossSubnet 서브넷 경계만 캡슐화로 성능 절감

운영 주의

  • MTU: 캡슐화 헤더만큼 유효 MTU가 줄어 인터페이스 MTU를 하향 조정해야 함. IPIP 약 20B, WireGuard 약 60B(IPv4 실측) 오버헤드가 붙으며 정확한 수치·중첩 계산은 "Overlay 비교" 글 참조
  • WireGuard 기본 인터페이스 MTU: 커널이 바깥 헤더 IPv6(오버헤드 80B)까지 감안해 1420으로 잡음 → IPv4 위에서는 20B 여유가 남음
  • IPIP 방화벽: 보안그룹·방화벽에서 IP 프로토콜 4를 명시적으로 허용해야 함. TCP/UDP 포트 규칙으로는 열리지 않으며, NAT를 지나면 프로토콜 4가 막히는 환경이 많음
  • WireGuard 방화벽: UDP 기본 포트 51820을 허용. 포트가 막혀 있으면 스텔스 특성상 응답이 없어 "무반응"으로 보이므로 방화벽부터 점검
  • 키 배포: WireGuard는 개인키가 노드 밖으로 나가면 안 되고, 피어 추가·폐기 시 공개키·AllowedIPs 배포 체계가 필요
  • 공통: 비대칭 경로·PMTU 블랙홀 주의. DF 비트 + 경로상 ICMP 차단이 겹치면 대형 패킷만 조용히 드롭됨

결론

  • IPIP는 바깥 IP 헤더 20B만 더하는 최소 캡슐화, 암호화·인증 없음 → 신뢰된 사설망 내부 라우팅용
  • WireGuard는 Noise_IK 핸드셰이크 + cryptokey routing으로 인증·암호화를 기본 내장 → 비신뢰 구간 터널용
  • 둘은 경쟁 관계가 아니라 계층 관계로, 신뢰 구간은 IPIP, 그 위 비신뢰 구간은 WireGuard로 감쌈
  • IPIP는 "빠르게 나르기", WireGuard는 "안전하게 나르기"라고 이해하면 됨