관련 가이드
WireGuard 깊이 알기: 작동 원리와 발전 과정
업데이트
WireGuard는 Jason A. Donenfeld가 설계한 오픈 소스 VPN 프로토콜로, 2015년 무렵 공개되어 2020년 정식으로 Linux 커널에 들어갔습니다. 특징을 한마디로 하면 '적다'입니다. 코드가 적습니다. 핵심 구현이 수천 줄뿐인데, OpenVPN과 IPsec은 수십만 줄입니다. 선택지가 적습니다. 암호 알고리즘은 고정된 한 세트뿐이고 고를 수 없습니다. 상태가 적습니다. '연결 중', '연결 끊김' 같은 개념이 없어서, 보낼 데이터가 있으면 보내고 없으면 조용히 있습니다. 적기 때문에 빠르고, 전력을 덜 쓰고, 감사하기 쉽습니다. 동시에 한계도 생깁니다. UDP만 쓰고, 위장이 없으며, 키를 어떻게 배포할지는 관여하지 않습니다. 아래에서 먼저 작동 방식을, 그다음 새 세대 VPN의 기반이 되기까지의 과정을 설명합니다.
설계 철학: VPN을 네트워크 카드처럼
WireGuard 이전의 주류는 IPsec과 OpenVPN이었습니다. IPsec은 거대한 표준 묶음이라 설정 항목이 매우 많고, 서로 다른 제조사 장비끼리 연동하기가 번거롭기로 유명합니다. OpenVPN은 사용자 공간에서 돌고 덩치 큰 TLS 라이브러리에 의존해, 유연하지만 느립니다. 둘 다 코드가 너무 많아 누군가 끝까지 감사하기 어렵습니다.
WireGuard의 발상은 그 반대입니다. 한 가지만 하되, 제대로 하자는 것입니다. 시스템에서는 가상 네트워크 카드(예: wg0)로 보입니다. 이 카드에 내 개인키와 상대 몇 곳의 공개키를 설정하면, 여기로 보낸 패킷은 암호화되어 나가고, 받은 패킷은 복호화되어 여기서 나옵니다. 나머지, 즉 라우팅, 방화벽, 주소 할당은 모두 시스템에 이미 있는 도구에 맡깁니다.
일부러 하지 않는 일도 분명합니다. 알고리즘 협상, 계정·비밀번호 관리, 주소 할당, 트래픽 위장은 하지 않습니다. 이것들은 취약점의 원인으로 여겨지거나, 상위 도구가 할 일로 남겨 둔 것입니다.
키 라우팅: 공개키가 곧 신원
WireGuard에서 각 기기는 키 한 쌍을 갖고, 공개키가 곧 그 기기의 신원입니다. SSH와 비슷한 방식입니다. 양쪽이 서로의 공개키를 자기 설정에 적으면 신뢰가 성립하며, 인증서도 사용자 이름이나 비밀번호도 없습니다.
설정에는 상대마다 '허용 주소'(AllowedIPs)를 하나씩 적습니다. 이 항목은 양방향을 모두 담당합니다. 보낼 때는 목적지 주소가 누구의 허용 범위에 들어가는지 보고 그 상대의 공개키로 암호화해 보냅니다. 받을 때는 복호화한 뒤 출발지 주소가 그 상대의 허용 범위 안인지 보고, 아니면 버립니다. 이 방식을 키 라우팅(cryptokey routing)이라고 합니다. 라우팅 표와 접근 제어가 하나의 표로 합쳐진 것입니다.
그래서 어떤 상대의 허용 주소를 0.0.0.0/0으로 적으면 '모든 트래픽을 그쪽으로', 즉 흔히 말하는 전체 VPN이 됩니다. 내부망 대역 하나만 적으면 그 대역에 접속할 때만 터널을 탑니다.
핸드셰이크와 암호화: 고정된 알고리즘 한 세트
두 기기가 처음 통신하기 전에 핸드셰이크를 합니다. 시작하는 쪽이 패킷 하나를 보내고 응답하는 쪽이 하나를 돌려주면, 한 번 주고받는 것으로 끝나고 양쪽은 이번에만 쓰는 세션 키를 얻습니다. 핸드셰이크는 Noise 프로토콜 프레임워크를 바탕으로, 양쪽의 장기 키로 서로를 인증하고 임시 키로 전방 보안을 보장합니다. 나중에 장기 개인키가 유출되더라도 예전에 녹화된 트래픽은 풀 수 없다는 뜻입니다.
세션 키는 몇 분마다 자동으로 바뀌며, 이 과정은 사용자에게 보이지 않고 '재연결'이라는 것도 없습니다.
암호 알고리즘은 고정입니다. 키 교환은 Curve25519, 데이터 암호화는 ChaCha20-Poly1305, 해시는 BLAKE2s입니다. 협상이 없으니 다운그레이드 공격도 없습니다. 공격자가 양쪽을 더 약한 알고리즘으로 유도할 방법이 없습니다. 앞으로 이 중 하나가 뚫리면, 옵션을 추가하는 것이 아니라 새 버전의 프로토콜로 통째로 교체하는 것이 해법입니다.
여기에 사전 공유 키를 하나 더 얹어 공개키 방식과 함께 쓸 수도 있습니다. 미래의 양자 컴퓨터가 공개키 알고리즘을 위협할 경우에 대비하기 위해서입니다.
UDP 전용, 낯선 상대에게 응답 안 함, 네트워크를 바꿔도 끊기지 않음
- UDP 전용: WireGuard는 패킷을 하나씩 암호화해 UDP 패킷 하나에 담아 보냅니다. TCP를 쓰지 않는 것은 의도적입니다. TCP 안에서 TCP를 돌리면 두 층이 모두 재전송을 해서, 패킷 손실이 생기면 서로의 발목을 잡습니다.
- 낯선 상대에게 응답 안 함: 인증되지 않은 패킷에는 일절 응답하지 않습니다. 포트를 스캔하는 쪽에서는 그 포트가 닫혀 있는 것처럼 보여, WireGuard가 돌고 있는지 알 길이 없습니다.
- 로밍: WireGuard는 '연결'이 아니라 공개키만 봅니다. 상대의 주소가 바뀌어도(휴대폰이 와이파이에서 모바일 데이터로 바뀌는 등), 그쪽에서 온 다음 패킷이 인증만 통과하면 이쪽은 자동으로 새 주소로 응답을 보냅니다. 그래서 네트워크를 바꿔도 터널이 끊기지 않습니다.
- 조용함: 보낼 데이터가 없을 때는 터널이 아무 트래픽도 만들지 않아서 휴대폰 배터리를 아낍니다. 기기가 공유기 뒤에 있으면서 상대가 늘 찾을 수 있어야 할 때만 주기적 유지 신호(PersistentKeepalive)를 켜서, 수십 초마다 작은 패킷을 보내 공유기의 매핑을 유지합니다.
왜 빠른가
- 커널에서 돕니다: Linux의 WireGuard는 커널 모듈이라, 패킷이 커널과 사용자 프로그램 사이를 오가며 복사될 필요가 없습니다. 전통적으로 사용자 공간에서 도는 OpenVPN은 패킷마다 한 바퀴를 더 돕니다.
- 모든 CPU에 맞는 알고리즘: ChaCha20은 전용 하드웨어 가속 명령에 의존하지 않아서, AES 명령이 없는 휴대폰과 공유기 칩에서 특히 유리합니다.
- 짧은 핸드셰이크: 한 번 주고받으면 바로 데이터를 보낼 수 있어 연결 수립에 기다림이 거의 없습니다.
- 적은 코드: 경로가 짧고, 할 수 있는 최적화를 핵심 단계 몇 곳에 모두 쏟았습니다.
- 주의할 점은, 이것이 프로토콜과 구현 자체의 부담에 관한 이야기라는 것입니다. 국경을 넘는 회선의 실제 속도는 회선의 패킷 손실과 통신사가 UDP를 어떻게 다루는지에 더 크게 좌우됩니다.
발전 과정: 한 사람의 프로젝트에서 커널까지
- 2015년 무렵: Jason A. Donenfeld가 WireGuard를 개발해 공개합니다. 처음에는 Linux용 독립 커널 모듈이었습니다.
- 2017년: 설계를 설명한 논문이 보안 학회 NDSS에서 발표되고, 이후 프로토콜은 여러 차례 독립적인 형식 검증을 거칩니다. 같은 무렵 Mullvad 등 VPN 업체가 WireGuard 접속을 제공하기 시작합니다.
- 2018년: Linux 창시자 Linus Torvalds가 메일링 리스트에서 코드를 칭찬하며, OpenVPN이나 IPsec에 비하면 예술 작품이라고 말합니다. 이 말로 개발자들 사이에 널리 알려집니다.
- 2019년: Cloudflare가 Rust로 만든 사용자 공간 구현 BoringTun을 공개하고 WARP에 WireGuard를 씁니다. NordVPN은 WireGuard 기반의 NordLynx를 내놓고, Tailscale도 이 무렵 WireGuard를 데이터 전송 계층으로 삼아 출발합니다.
- 2020년 3월: WireGuard가 Linux 5.6과 함께 커널 메인라인에 정식으로 합쳐지고, 동시에 1.0 버전이 나옵니다. 이때부터 주요 Linux 배포판에 WireGuard가 기본으로 들어가 모듈을 따로 설치할 필요가 없습니다. 같은 해 OpenBSD도 커널에 넣습니다.
- 2021년: Windows용 커널 구현 WireGuardNT가 나와 이전 사용자 공간 구현보다 성능이 한 단계 높아집니다. 이어 FreeBSD에도 커널 구현이 생깁니다.
- 현재: Windows, macOS, Linux, iOS, Android 모두 공식 클라이언트가 있고, OpenWrt, 시놀로지 등 공유기와 NAS 시스템이 널리 내장 지원하며, 대부분의 상용 VPN이 기본 또는 선택 프로토콜로 제공합니다.
하지 않는 일과 그로 인한 한계
- 키 배포를 관리하지 않음: 기기를 하나 추가할 때마다 그 공개키를 다른 기기들의 설정에 적어야 합니다. 기기가 많아지면 감당이 안 되는데, 바로 이것이 Tailscale 같은 도구가 존재하는 이유입니다.
- 주소를 동적으로 할당하지 않음: 각 상대의 내부 주소는 설정에 고정으로 적혀 있고, OpenVPN처럼 '연결되면 주소를 하나 내려 주는' 방식이 없습니다. 상용 VPN은 이를 쓸 때 바깥에 한 층을 따로 만들어야 합니다.
- 개인정보 측면의 우려: 서버는 응답을 보내기 위해 각 상대의 최근 공인 주소를 기억해야 합니다. '로그를 남기지 않음'을 지켜야 하는 VPN 업체는 보통 추가 처리(정기적 삭제, 이중 주소 변환 등)를 합니다.
- UDP뿐: UDP를 막거나 속도를 제한하는 네트워크에서는 안 되거나 매우 느립니다. TCP나 443 포트로 보내려면 바깥에 다른 도구를 한 겹 씌우는 수밖에 없습니다.
- 위장 없음: 핸드셰이크 패킷과 데이터 패킷의 형식과 길이에 고정된 특징이 있어 쉽게 식별됩니다. 설계 목표는 보안과 단순함이지, 검열 회피가 아닙니다.
- 계정 체계 없음: 프로토콜에는 사용자 이름, 비밀번호, 만료일 같은 개념이 없고, 오직 공개키만 봅니다.
OpenVPN, IPsec과의 비교
- 코드 양: WireGuard 핵심은 수천 줄입니다. OpenVPN은 의존하는 TLS 라이브러리까지 더하면, IPsec은 여러 구현 모두 수십만 줄 규모입니다.
- 전송: WireGuard는 UDP뿐입니다. OpenVPN은 둘 다 되고 TCP 443으로 HTTPS 트래픽과 같은 포트에 섞일 수 있습니다. IPsec은 자체 프로토콜 번호와 UDP 500 / 4500을 씁니다.
- 설정: WireGuard는 상대 하나에 몇 줄입니다. OpenVPN 설정 파일은 옵션이 많지만 유연하고, IPsec이 가장 복잡합니다.
- 성능: 깨끗한 네트워크에서는 대개 WireGuard가 가장 빠르고 전력을 덜 씁니다. OpenVPN도 새 버전에서 커널 가속(DCO)이 생겨 격차가 줄고 있습니다.
- 기능: 계정·비밀번호 인증, 주소와 경로의 동적 배포, TCP 전송은 OpenVPN에 기본으로 있지만, WireGuard는 모두 바깥 시스템으로 보완해야 합니다.
- 기기 지원: OpenVPN은 역사가 길어서 오래된 공유기, NAS, 각종 임베디드 기기가 거의 다 지원합니다. WireGuard는 최근 몇 년 사이의 시스템에는 보편화됐지만, 오래된 기기에는 없을 수 있습니다.
WireGuard 위에서 자라난 것들
- Tailscale: WireGuard에 로그인, 키 배포, NAT 통과, 중계를 더해 자동 네트워크 구성으로 만든 것입니다. Tailscale 깊이 알기를 보세요. Headscale은 그 오픈 소스 컨트롤 서버 구현입니다.
- Netmaker, NetBird, Firezone 등: 마찬가지로 'WireGuard가 데이터 전송, 관리 계층은 자체 구현'인 네트워크 구성 또는 제로 트러스트 제품입니다.
- Cloudflare WARP: 일반 사용자용 WireGuard 클라이언트로, 트래픽을 Cloudflare 네트워크로 보냅니다.
- 상용 VPN의 자체 포장: NordLynx 등으로, WireGuard 바깥에 주소 할당과 개인정보 처리를 한 층 더한 것입니다.
- AmneziaWG 등 변형: 패킷 헤더와 채움 데이터를 바꿔 WireGuard의 고정 특징을 숨기는 것으로, 검사가 엄격한 네트워크용입니다. 표준 WireGuard 클라이언트와는 서로 호환되지 않습니다.
중국 네트워크에서는
- 쓸 수 있는지는 먼저 UDP에 달렸습니다. 많은 유선 인터넷과 모바일 네트워크가 대용량 UDP의 속도를 제한해서, 처음 연결하면 빠르다가 조금 지나면 느려지거나, 저녁 피크에 눈에 띄게 끊기는 모습으로 나타납니다.
- 국경을 넘는 직접 연결은 식별되기 쉽습니다. WireGuard의 핸드셰이크 패킷은 특징이 고정돼 있어 국제 구간에서 식별되고 방해받을 수 있으며, 핸드셰이크가 안 되거나 얼마간 쓰다가 트래픽이 끊기는 모습으로 나타납니다. 프로토콜에 위장이 없는 데서 오는 직접적인 결과입니다.
- 중국 안의 기기끼리 구성하는 네트워크(회사와 집, 휴대폰과 NAS)는 국제 구간을 지나지 않아 대개 이런 문제가 없고, UDP 속도 제한과 홀 펀칭 성공률의 영향만 받습니다.
- 그래서 WireGuard는 네트워크 구성과 원격 접속에 더 잘 맞습니다. 국경을 넘어 오래 안정적으로 쓰려면 위장이 있거나 TCP / TLS로 갈 수 있는 방식과 함께 써야 합니다. 프로토콜별 비교는 VPN 프로토콜 비교에 있습니다.
LeoTun에서 WireGuard를 쓰는 곳
LeoTun의 '사설망' 섹션은 Tailscale을 쓰고, 그 데이터 전송 계층이 바로 WireGuard입니다. 기기 사이의 터널과 각 지역 출구 노드로 가는 터널 모두 WireGuard가 암호화하고 전달합니다. 직접 키를 만들거나 설정을 쓸 필요는 없고, 이 사이트 계정으로 로그인하면 클라이언트가 자동으로 처리합니다. 사용법은 사설망(Tailscale)이란에 있고, 입구는 사설망 페이지입니다.
사설망 말고도 같은 계정에는 UDP에 의존하지 않는 방식이 있습니다. Cisco(AnyConnect)는 TLS로 가고, OpenVPN은 TCP로도 갈 수 있으며, Hiddify(Hysteria2)는 패킷 손실에 맞서도록 만들어졌습니다. 지금 있는 네트워크에서 사설망이 느리고 불안정하면 다른 방식으로 바꾸면 됩니다. 접속 방식별 추천 상황을 보세요.
FAQ
WireGuard와 OpenVPN 중 어느 것이 좋나요?
깨끗하고 UDP를 제한하지 않는 네트워크에서는 WireGuard가 더 빠르고, 전력을 덜 쓰고, 네트워크를 바꿔도 끊기지 않습니다. TCP로 가야 하거나, 계정·비밀번호 로그인이 필요하거나, 기기가 오래됐다면 OpenVPN이 더 맞습니다. 둘 다 오래 검증된 오픈 소스 프로토콜이라 보안 면에서는 모두 믿을 만합니다.
WireGuard는 안전한가요?
현대적이면서 보수적인 알고리즘 세트를 쓰고, 프로토콜은 형식 검증을 거쳤으며, 코드가 적어 감사하기 쉽습니다. 현재 알려진 실질적인 공격 방법은 없습니다. 다만 키의 보관과 배포는 책임지지 않으므로, 개인키가 유출되거나 공개키를 엉뚱한 상대에 설정하면 프로토콜도 도와줄 수 없습니다.
WireGuard는 왜 UDP만 지원하나요?
설계상의 선택입니다. TCP 연결 안에서 TCP를 돌리면 패킷 손실 때 두 층이 동시에 재전송해 성능이 급격히 떨어집니다. 또 UDP라야 '낯선 상대에게 응답하지 않기'와 로밍을 쉽게 구현할 수 있습니다. 대가는 UDP를 막는 네트워크에서는 쓸 수 없다는 것입니다.
중국에서 WireGuard를 쓸 수 있나요?
중국 안의 기기끼리 네트워크를 구성하는 것은 대개 됩니다. 국경을 넘는 직접 연결은 불안정합니다. 트래픽에 위장이 없어 식별되고 방해받기 쉽고, 일부 회선은 UDP 속도도 제한합니다. 국경을 넘어 안정적으로 쓰려면 위장이 있거나 TLS로 가는 방식과 함께 써야 합니다.
WireGuard는 누가 만들었고, 언제 Linux 커널에 들어갔나요?
Jason A. Donenfeld가 설계하고 개발해 2015년 무렵 공개했습니다. 2020년 3월 Linux 5.6과 함께 커널 메인라인에 합쳐졌고, 동시에 1.0 버전이 나왔습니다.
Tailscale이 곧 WireGuard인가요?
같은 것이 아닙니다. WireGuard는 암호화 터널 프로토콜이고, Tailscale은 WireGuard로 데이터를 전송하는 네트워크 구성 시스템으로, 로그인, 키 배포, NAT 통과, 중계를 따로 해결합니다. 자세한 내용은 Tailscale 깊이 알기에 있습니다.
WireGuard를 쓰려면 직접 키를 설정해야 하나요?
WireGuard를 직접 쓴다면 그렇습니다. 기기마다 키를 만들고, 공개키, 주소, 상대 주소를 설정에 적어야 합니다. Tailscale이나 상용 VPN 클라이언트로 쓰면 소프트웨어가 대신해 줍니다. LeoTun의 사설망에서는 계정으로 로그인하면 끝입니다.