GotaTun – Mullvad의 Rust 기반 WireGuard 구현
(mullvad.net)- GotaTun은 Rust로 작성된 WireGuard 구현체로, 빠르고 효율적이며 안정적인 VPN 연결을 목표로 함
- Cloudflare의 BoringTun 프로젝트를 포크해 개발되었으며, DAITA와 Multihop 같은 Mullvad의 프라이버시 기능을 통합
- 기존 wireguard-go에서 발생하던 충돌 문제를 해결하기 위해 Android 버전에 먼저 적용, 충돌률 0.40% → 0.01% 로 감소
- Rust 기반으로 전환하면서 FFI 복잡성과 Go 런타임 불안정성 문제를 제거, 유지보수성과 디버깅 효율 향상
- Mullvad는 2026년에 모든 플랫폼으로 GotaTun 확대와 보안 감사 및 성능 개선을 계획
GotaTun 개요
-
GotaTun은 Mullvad VPN이 개발한 Rust 기반 WireGuard® 구현체로, 빠른 속도와 안정성, 효율성을 목표로 함
- Cloudflare의 BoringTun을 포크하여 개발
- 이름은 BoringTun과 스웨덴 예테보리의 터널 Götatunneln을 결합한 형태
- DAITA와 Multihop 같은 Mullvad의 프라이버시 강화 기능을 통합
- Rust의 안전한 멀티스레딩과 zero-copy 메모리 전략을 활용해 성능 최적화
- 2024년 11월 말 Android 버전에 배포 완료, 다른 플랫폼은 2026년 출시 예정
기존 wireguard-go의 한계
- Mullvad의 모바일 앱은 수년간 Go 기반 wireguard-go를 사용해 왔음
- 여러 VPN 제공업체가 동일한 구현체를 사용
- 2024년 중반부터 Mullvad는 DAITA와 Multihop 지원을 위해 wireguard-go를 포크해 유지
- 그러나 Google Play 개발자 콘솔에서 보고된 충돌의 85% 이상이 wireguard-go에서 발생
- 일부 문제는 해결되었으나 다수는 여전히 남아 있음
-
Rust와 Go 간 FFI(외부 함수 인터페이스) 사용으로 인한 복잡성과 불안정성 존재
- Go 런타임의 동작이 Rust 코드에서 불투명하며, 충돌 시 스택 추적 복구가 어려움
- 이로 인해 디버깅과 장기 유지보수가 어려운 상황
Android에서의 결과
- GotaTun 도입 후 단 한 건의 충돌도 발생하지 않음
- wireguard-go에서 발생하던 모든 충돌이 제거됨
- Android 앱 버전 2025.10(11월 말 출시) 이후 사용자 체감 충돌률이 0.40% → 0.01%로 감소
- 사용자 피드백에서도 속도 향상과 배터리 사용량 감소가 보고됨
향후 계획
- 2026년 초 제3자 보안 감사 진행 예정
- 모든 플랫폼(데스크톱, iOS 포함) 에서 wireguard-go를 GotaTun으로 교체 예정
- 성능 개선 작업을 지속 추진
- Mullvad는 2026년을 GotaTun 확장의 주요 전환점으로 설정
Hacker News 의견들
-
Pixel 8에서 성능 향상이 확실히 느껴졌음
예전에는 wireguard-go가 100Mbps도 못 뽑았는데, GotaTun 버전에서는 500Mbps 이상 나옴
다만 새 버그로 인해 딥슬립 모드에 들어가지 못해 배터리가 갑자기 10배 빨리 닳는 문제가 생김- 내 구형 Samsung A5에서는 wireguard를 24/7 켜놔도 배터리가 오래감
Pixel 8이 훨씬 강력한데 이런 문제가 있다면 Android 쪽 버그일 가능성이 높음 - 나도 ZeroTier나 MizuDroid에서 비슷한 현상을 봤음. Android 네트워크 스택 쪽 문제로 보임
- Raspberry Pi 5에서도 같은 현상이 있었음. 아마 ARM 최적화 부족 때문일 수 있음
- MTU 1320 문제일 가능성 있음
- Mullvad 앱이 Pixel 6a에서 갑자기 1초 만에 연결되기 시작한 이유가 이거였음. 예전엔 5~10초 걸렸음
- 내 구형 Samsung A5에서는 wireguard를 24/7 켜놔도 배터리가 오래감
-
나는 WireGuard를 정말 좋아해서 WrapGuard라는 프로젝트를 직접 만들었음
루트 권한 없이 앱을 실행할 수 있게 Go로 작성했음
Rust를 잘 모르는데, 펌웨어나 네트워킹 소프트웨어에는 Rust가 더 적합한지 궁금함
WrapGuard GitHub 링크- 펌웨어는 GC 없는 환경에서 동작해야 하므로 Rust가 더 적합함
Rust는 예측 가능한 타이밍과 강력한 타입 시스템 덕분에 신뢰성이 높음
하지만 네트워킹 소프트웨어에서는 Go도 충분히 좋고, 결국 “익숙한 언어를 쓰는 게 낫다”는 게 결론임 - 결국 “익숙한 악마를 택하라”는 말처럼, 아는 언어를 쓰는 게 현실적임
- Go는 FFI가 어려워서 임베디드 라이브러리로 쓰기엔 Rust가 더 유리함
- 암호화가 필요 없는 로컬 컨테이너 네트워킹용으로는 어떤 게 좋을지 고민 중임
Apple의 새로운 container tool을 써보려 함 - 여러 VPN 터널을 하나로 묶는 기능이 있으면 좋겠음
예를 들어 airVPN은 5개의 동시 연결을 허용하니, 이를 병합해 트래픽을 결합할 수 있으면 좋겠음
- 펌웨어는 GC 없는 환경에서 동작해야 하므로 Rust가 더 적합함
-
GotaTun이 Tailscale Android 앱에도 적용되면 좋겠음. 나는 Mullvad 접속에 Tailscale을 씀
- GotaTun은 Mullvad 전용 기능이라 Tailscale이 채택할 가능성은 낮음
Tailscale 팀은 Go 기반 라이브러리 최적화에 능숙하고,
2023년 4월에는 wireguard-go로 10Gbps 성능을 달성했음
관련 블로그 글
- GotaTun은 Mullvad 전용 기능이라 Tailscale이 채택할 가능성은 낮음
-
Go의 메모리 페이징 문제와 goroutine의 스택 오버플로 방지에 대한 이슈가 흥미로웠음
왜 GoString이 그렇게 많은 메모리를 페이지 인하는지 궁금함
이슈 #6727, 이슈 #7728 참고 -
WireGuard 프로토콜 자체도 개선되면 좋겠음
현재는 정부나 ISP의 차단을 뚫기 어렵다는 한계가 있음- 이건 WireGuard의 역할이 아니라 shadowsocks 같은 캡슐화 프로토콜이 담당해야 함
WireGuard는 단순한 L3 UDP 터널로 설계됨 - 이런 이유로 amnezia-wg 같은 포크들이 존재함
- Mullvad 앱에는 shadowsocks 등 우회 옵션이 있지만,
프로토콜 자체에 내장되어 있으면 더 좋을 것 같음 - 관련 내용을 더 읽고 싶다면 공식 문서의 Known Limitations 섹션을 참고하면 됨
- 이건 WireGuard의 역할이 아니라 shadowsocks 같은 캡슐화 프로토콜이 담당해야 함
-
구현팀이 있다면 묻고 싶음 — 왜 변경사항을 BoringTun에 업스트림하지 않았는지 궁금함
- BoringTun은 3년째 구조 개편 중이라, Mullvad가 독립적으로 진행한 게 이해됨
여러 구현이 존재할수록 프로토콜의 안정성과 신뢰성이 높아짐
개인적으로는 Cloudflare보다 Mullvad를 더 신뢰함 - BoringTun은 사실상 유지보수 중단 상태임
Obscura VPN에서는 NepTUN 포크로 전환했음
NepTUN GitHub 링크
Mullvad가 왜 새로 포크했는지, 기존 포크와 통합할 계획이 있는지 궁금함
- BoringTun은 3년째 구조 개편 중이라, Mullvad가 독립적으로 진행한 게 이해됨
-
Mullvad가 VPN 중 가장 신뢰할 만한 선택이라고 생각함
하지만 사람들은 유튜버의 할인 코드에 더 끌림- Mullvad는 프라이버시 면에서는 최고지만, 대부분의 VPN 차단 리스트에 걸림
NordVPN은 그걸 잘 우회함. 예를 들어 Imgur나 영국 내 접속 시 Mullvad는 막힘 - 일반 사용자들은 지리적 차단 해제가 목적이라 Mullvad는 매력적이지 않음
- 포트 포워딩이 중단된 이후로 선택지에서 빠진 사람도 많음
- Mullvad의 IP가 스트리밍 서비스에서 자주 차단돼서 Nord를 쓸 수밖에 없음
- 게다가 여러 VPN 브랜드를 한 회사가 인수해 재브랜딩하는 경우도 많음
- Mullvad는 프라이버시 면에서는 최고지만, 대부분의 VPN 차단 리스트에 걸림
-
WireGuard가 Android에서 커널 내에서 동작하는 줄 알았음
- 실제로는 모듈로 활성화해야 하는데, Android 커널에서는 비활성화되어 있음
-
wireguard-go의 크래시 원인 분석 데이터를 더 보고 싶음
라이브러리 자체 버그인지, FFI 문제인지 궁금함- WireGuard가 단순한 UDP 기반이라 크래시가 있다는 게 의외였음
-
나는 MintFlow 앱에서 Go 기반 프록시 코드를 쓰지 않음
대신 Rust로 일부 프록시 프로토콜을 구현함
WireGuard는 fdio vpp 플러그인 기반의 C 구현을 사용함- iOS에서 vpp 기반 구현이 가능하다는 게 놀라움
나도 예전에 vpp를 6개월 정도 다뤄봤는데 꽤 흥미로웠음
- iOS에서 vpp 기반 구현이 가능하다는 게 놀라움