4 điểm bởi GN⁺ 2025-12-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • GotaTun là một bản triển khai WireGuard được viết bằng Rust, hướng tới kết nối VPN nhanh, hiệu quả và ổn định
  • Được phát triển bằng cách fork dự án BoringTun của Cloudflare, đồng thời tích hợp các tính năng quyền riêng tư của Mullvad như DAITAMultihop
  • Được áp dụng trước tiên cho phiên bản Android để giải quyết các vấn đề crash từng xảy ra ở wireguard-go, giúp tỷ lệ crash giảm từ 0,40% xuống 0,01%
  • Việc chuyển sang nền tảng Rust loại bỏ các vấn đề về độ phức tạp FFIsự bất ổn của runtime Go, đồng thời cải thiện khả năng bảo trì và hiệu quả gỡ lỗi
  • Mullvad có kế hoạch mở rộng GotaTun sang mọi nền tảng vào năm 2026 cùng với kiểm toán bảo mật và cải thiện hiệu năng

Tổng quan về GotaTun

  • GotaTunbản triển khai WireGuard® dựa trên Rust do Mullvad VPN phát triển, hướng tới tốc độ cao, độ ổn định và hiệu quả
    • Được phát triển bằng cách fork BoringTun của Cloudflare
    • Tên gọi là sự kết hợp giữa BoringTun và đường hầm Götatunneln ở Göteborg, Thụy Điển
  • Tích hợp các tính năng tăng cường quyền riêng tư của Mullvad như DAITAMultihop
  • Tối ưu hiệu năng bằng cách tận dụng đa luồng an toàn của Rustchiến lược bộ nhớ zero-copy
  • Đã được phát hành cho phiên bản Android vào cuối tháng 11 năm 2024, các nền tảng khác dự kiến ra mắt trong năm 2026

Giới hạn của wireguard-go trước đây

  • Ứng dụng di động của Mullvad đã sử dụng wireguard-go dựa trên Go trong nhiều năm
    • Nhiều nhà cung cấp VPN cũng dùng cùng bản triển khai này
  • Từ giữa năm 2024, Mullvad đã fork và tự duy trì wireguard-go để hỗ trợ DAITA và Multihop
  • Tuy nhiên, hơn 85% số crash được báo cáo trong Google Play Developer Console đều phát sinh từ wireguard-go
    • Một số vấn đề đã được khắc phục, nhưng nhiều lỗi vẫn còn tồn tại
  • Có sự phức tạp và bất ổn do sử dụng FFI (giao diện hàm ngoài) giữa Rust và Go
    • Cách hoạt động của runtime Go không minh bạch từ phía mã Rust, và khi crash xảy ra thì rất khó khôi phục stack trace
    • Điều này khiến việc gỡ lỗi và bảo trì dài hạn trở nên khó khăn

Kết quả trên Android

  • Sau khi áp dụng GotaTun, không còn xảy ra bất kỳ crash nào
    • Mọi crash từng phát sinh từ wireguard-go đều đã được loại bỏ
  • Sau phiên bản ứng dụng Android 2025.10 (phát hành cuối tháng 11), tỷ lệ crash mà người dùng cảm nhận được đã giảm từ 0,40% xuống 0,01%
  • Phản hồi từ người dùng cũng cho thấy tốc độ được cải thiện và mức tiêu thụ pin giảm

Kế hoạch sắp tới

  • Dự kiến tiến hành kiểm toán bảo mật bởi bên thứ ba vào đầu năm 2026
  • Dự kiến thay thế wireguard-go bằng GotaTun trên mọi nền tảng (bao gồm desktop và iOS)
  • Tiếp tục thúc đẩy các công việc cải thiện hiệu năng
  • Mullvad xác định năm 2026 là bước ngoặt lớn cho việc mở rộng GotaTun

1 bình luận

 
GN⁺ 2025-12-20
Ý kiến trên Hacker News
  • Trên Pixel 8, có thể cảm nhận rõ hiệu năng được cải thiện
    Trước đây wireguard-go còn không đạt nổi 100Mbps, nhưng với phiên bản GotaTun thì vượt 500Mbps
    Tuy nhiên, do lỗi mới nên máy không thể vào chế độ deep sleep, khiến pin đột nhiên tụt nhanh gấp 10 lần

    • Trên chiếc Samsung A5 cũ của tôi, dù bật wireguard 24/7 thì pin vẫn rất trâu
      Pixel 8 mạnh hơn nhiều, nên nếu gặp vấn đề này thì có khả năng cao là lỗi phía Android
    • Tôi cũng thấy hiện tượng tương tự với ZeroTier và MizuDroid. Có vẻ là vấn đề ở network stack của Android
    • Tôi cũng gặp hiện tượng tương tự trên Raspberry Pi 5. Có thể là do thiếu tối ưu hóa ARM
    • Có thể là vấn đề MTU 1320
    • Đây chính là lý do ứng dụng Mullvad trên Pixel 6a bỗng bắt đầu kết nối chỉ trong 1 giây. Trước đây mất 5~10 giây
  • Tôi thật sự rất thích WireGuard nên đã tự làm một dự án tên là WrapGuard
    Tôi viết nó bằng Go để có thể chạy ứng dụng mà không cần quyền root
    Tôi không rành Rust, nên khá tò mò liệu Rust có phù hợp hơn cho firmware hay phần mềm mạng hay không
    Liên kết GitHub của WrapGuard

    • Firmware phải chạy trong môi trường không có GC, nên Rust phù hợp hơn
      Nhờ thời gian thực thi có thể dự đoán được và hệ thống kiểu mạnh, Rust có độ tin cậy cao hơn
      Nhưng với phần mềm mạng thì Go cũng đủ tốt, và cuối cùng kết luận vẫn là “dùng ngôn ngữ mình quen thuộc sẽ tốt hơn
    • Cuối cùng thì đúng là kiểu “chọn con quỷ mình đã quen”, dùng ngôn ngữ mình biết vẫn là thực tế nhất
    • Go gặp khó với FFI nên nếu dùng làm thư viện nhúng thì Rust có lợi thế hơn
    • Tôi đang phân vân không biết cái nào phù hợp hơn cho mạng container cục bộ không cần mã hóa
      Tôi định thử container tool mới của Apple
    • Sẽ hay hơn nếu có chức năng gộp nhiều đường hầm VPN thành một
      Ví dụ, airVPN cho phép 5 kết nối đồng thời, nên sẽ tuyệt nếu có thể gộp chúng lại để kết hợp lưu lượng
  • Tôi mong GotaTun cũng được áp dụng cho ứng dụng Tailscale trên Android. Tôi dùng Tailscale để kết nối với Mullvad

    • GotaTun là tính năng dành riêng cho Mullvad nên khả năng Tailscale áp dụng là thấp
      Đội ngũ Tailscale rất giỏi tối ưu thư viện nền Go,
      và vào tháng 4/2023 họ đã đạt hiệu năng 10Gbps với wireguard-go
      Bài viết blog liên quan
  • Vấn đề phân trang bộ nhớ của Go và chuyện goroutine ngăn tràn stack khá thú vị
    Tôi tò mò vì sao GoString lại phân trang nhiều bộ nhớ đến vậy
    Tham khảo vấn đề #6727, vấn đề #7728

  • Tôi cũng muốn chính giao thức WireGuard được cải thiện
    Hiện tại nó có hạn chế là khó vượt qua sự chặn của chính phủ hay ISP

    • Đây không phải vai trò của WireGuard mà là phần việc của các giao thức đóng gói như shadowsocks
      WireGuard được thiết kế như một đường hầm UDP L3 đơn giản
    • Vì lý do này nên mới có các fork như amnezia-wg
    • Ứng dụng Mullvad có các tùy chọn vượt chặn như shadowsocks,
      nhưng sẽ tốt hơn nếu thứ đó được tích hợp ngay trong giao thức
    • Nếu muốn đọc thêm về chủ đề này, có thể xem phần Known Limitations trong tài liệu chính thức
  • Nếu có ai trong đội triển khai ở đây thì tôi muốn hỏi — vì sao các thay đổi này không được upstream lên BoringTun?

    • BoringTun đã tái cấu trúc suốt 3 năm, nên việc Mullvad đi theo hướng riêng là điều có thể hiểu được
      Càng có nhiều cách triển khai thì độ ổn định và độ tin cậy của giao thức càng cao
      Cá nhân tôi tin Mullvad hơn Cloudflare
    • BoringTun thực tế gần như ở trạng thái không còn được bảo trì
      Obscura VPN đã chuyển sang fork NepTUN
      Liên kết GitHub của NepTUN
      Tôi tò mò vì sao Mullvad lại tạo fork mới, và liệu có kế hoạch hợp nhất với các fork hiện có hay không
  • Tôi nghĩ Mullvad là lựa chọn đáng tin cậy nhất trong các VPN
    Nhưng mọi người lại bị hấp dẫn hơn bởi mã giảm giá của các YouTuber

    • Mullvad là tốt nhất về quyền riêng tư, nhưng lại nằm trong hầu hết danh sách chặn VPN
      NordVPN vượt qua chuyện đó khá tốt. Ví dụ như với Imgur hoặc truy cập từ Anh, Mullvad sẽ bị chặn
    • Người dùng phổ thông chủ yếu muốn gỡ chặn theo khu vực địa lý, nên Mullvad không quá hấp dẫn
    • Cũng có nhiều người loại nó khỏi lựa chọn sau khi port forwarding bị ngừng hỗ trợ
    • IP của Mullvad thường bị các dịch vụ streaming chặn nên tôi đành phải dùng Nord
    • Hơn nữa, cũng có nhiều trường hợp một công ty thâu tóm rồi đổi thương hiệu hàng loạt nhãn VPN
  • Tôi cứ nghĩ WireGuard trên Android là chạy trong kernel

    • Thực tế là phải kích hoạt dưới dạng module, nhưng trong kernel Android thì nó đang bị vô hiệu hóa
  • Tôi muốn xem thêm dữ liệu phân tích nguyên nhân crash của wireguard-go
    Tôi tò mò không biết là lỗi của chính thư viện hay do vấn đề FFI

    • WireGuard vốn đơn giản, dựa trên UDP, nên việc có crash cũng khá bất ngờ
  • Trong ứng dụng MintFlow, tôi không dùng mã proxy viết bằng Go
    Thay vào đó tôi triển khai một số giao thức proxy bằng Rust
    Với WireGuard, tôi dùng bản triển khai C dựa trên plugin fdio vpp

    • Thật ngạc nhiên là trên iOS lại có thể dùng bản triển khai dựa trên vpp
      Trước đây tôi cũng từng làm với vpp khoảng 6 tháng, và thấy nó khá thú vị