WireGuard vs Tailscale cho vibe coder - chọn nào khi laptop làm việc với VPS đa khu vực

Mục lục


WireGuard vs Tailscale - VPN cho vibe coder
WireGuard vs Tailscale - chọn nào cho stack laptop + VPS đa khu vực

Bạn là vibe coder solo, code app/web trên laptop, deploy lên 1 VPS ở Việt Nam (cho khách VN, latency thấp) và 1 VPS ở US (cho khách Mỹ, hoặc làm worker chạy job nặng). Tuần nào cũng SSH, tunnel database, preview Next.js dev server, sync file, đôi khi test trên điện thoại. Bạn cần 1 lớp network ở giữa, nhưng không muốn ngồi cả ngày config firewall và port forward.

Bài này so sánh 3 lựa chọn: WireGuard raw (tự dựng), Tailscale (managed mesh, build trên WireGuard), và OpenVPN (chỉ nhắc qua để so cho rõ vì nó client-server, không hợp use case này). Mục tiêu: chọn được 1 stack trong 30 phút, không cần đọc 10 bài Reddit khác.

Setup mà chúng ta đang giải quyết

3 thực thể, mỗi pair có thể cần nói chuyện với nhau:

Laptop (NAT, WiFi cafe / 4G / nhà)
   |
   |--- pair 1 ---> VPS VN (public IP)
   |--- pair 2 ---> VPS US (public IP)
                       |
                       |--- pair 3 ---> giữa 2 VPS

Các use case sẽ chạm vào cả 3 pair này. Đôi khi chỉ 1 pair, đôi khi cả 3.

9 case vibe coder hay gặp

Đây là các tình huống mình và bạn bè dev gặp gần như mỗi tuần khi build app/web với stack laptop + 2 VPS.

Case 1. SSH vào VPS debug log

Service deploy lên VPS bị 500. Bạn cần SSH vào xem log, restart service.

Không VPN: phải mở port 22 public + key auth + fail2ban + UFW rule. Bot scan SSH brute force 24/7, log spam.

VPN: SSH bind chỉ trên VPN interface, port 22 không expose public, bot bó tay.

Case 2. Truy cập database từ DBeaver/TablePlus

PostgreSQL/MySQL/MongoDB chạy trên VPS, bind 127.0.0.1 (không bao giờ public). Bạn muốn nối từ GUI tool trên laptop để query, debug data.

Không VPN: phải ssh tunnel mỗi lần - ssh -L 5432:localhost:5432 vps. Tunnel chết khi network đổi, phải re-establish.

VPN: database bind trên IP VPN của VPS, GUI tool nối trực tiếp như local, không tunnel thủ công.

Case 3. Preview Next.js/Vite dev server chạy trên VPS

Laptop của bạn cấu hình yếu (Air M1 8GB RAM), build Docker image cho project lớn nóng máy. Bạn ssh vào VPS chạy npm run dev ở đó, muốn xem live ở browser laptop.

Không VPN: tunnel ssh port 3000 hoặc ngrok. Ngrok free có rate limit, link thay đổi mỗi lần restart.

VPN: mở http://10.0.0.2:3000 trên laptop, hot reload chạy ngon như local.

Case 4. Sync file dev assets bằng rsync

Upload bộ ảnh sản phẩm 2GB lên VPS, hoặc pull database backup 5GB về laptop để inspect.

Không VPN: rsync qua SSH với port 22 public. Hoạt động ổn.

VPN: rsync qua IP VPN, không cần expose SSH. Bandwidth giống nhau vì rsync qua SSH cũng encrypted sẵn.

Case 5. VPS VN gọi API VPS US (cross-region service)

App chạy 2 region. VPS VN serve request VN. Có job nặng (AI inference, video transcode) đẩy sang VPS US qua message queue. Hoặc VPS VN cần đọc cache từ Redis trên VPS US.

Không VPN: phải open Redis port public, set bind-address, set password phức tạp, sợ bị scan ransomware Redis (chuyện xảy ra rất nhiều).

VPN: Redis bind chỉ trên VPN interface, không public, mật khẩu vẫn dùng nhưng attack surface gần như 0.

Case 6. Test app từ điện thoại khi đang ở cafe

Đang code mobile-responsive UI, muốn mở app trên iPhone để test touch interaction thật. App chạy trên VPS hoặc trên laptop.

Không VPN: nếu app trên laptop thì phải đảm bảo điện thoại và laptop cùng WiFi cafe (đôi khi cafe block client isolation). Nếu app trên VPS thì phải public port.

VPN: cài app VPN trên điện thoại, mở browser gõ http://10.0.0.1:3000 là thấy app, dù điện thoại đang 4G hay WiFi cafe.

Case 7. Laptop chuyển network giữa cafe/nhà/4G/khách sạn

Đang SSH vào VPS, ra ngoài tắt WiFi mở 4G, vào quán cafe đổi WiFi. SSH session đang chạy tail -f log hay npm run dev.

Không VPN: SSH session chết, phải reconnect, có khi mất cả tmux session.

VPN: tốt thì IP VPN giữ nguyên dù outer IP đổi, SSH session sống. Không tốt thì cũng phải reconnect.

Case 8. Cấp tạm quyền cho cộng tác viên xem dev preview

Bạn đang demo app cho 1 freelancer designer hoặc khách. Họ ở thành phố khác.

Không VPN: deploy lên staging public URL, set basic auth, gửi link.

VPN: invite họ vào mạng VPN, share IP nội bộ. Họ không vào được sau khi xong việc - bạn revoke device.

Case 9. Build hệ thống monitoring cá nhân

Bạn cài Prometheus + Grafana trên 1 VPS, scrape metrics từ VPS khác (node_exporter, app metrics, healthcheck). Bạn muốn xem Grafana từ laptop nhưng không muốn expose Grafana public.

Không VPN: Cloudflare Tunnel + Access (work tốt, free, nhưng phải config).

VPN: Grafana bind nội bộ, mở http://10.0.0.2:3000 từ laptop, không cần Cloudflare.

3 lựa chọn, mental model nhanh

OpenVPN: cũ kỹ, client-server

OpenVPN là kiến trúc 1 server, N client. Tất cả traffic phải đi qua server trung tâm. Trong setup laptop + 2 VPS, nếu chọn OpenVPN thì 1 trong 2 VPS phải làm OpenVPN server, VPS còn lại + laptop làm client.

Hệ quả: VPS VN nói chuyện với VPS US phải đi qua server. Nếu server đặt ở VN thì traffic VN-US-VN-VN gấp đôi quãng đường. SSL/TLS qua TLS, performance chậm hơn 30-50% so với WireGuard. Setup phức tạp (CA, cert, ccd, push route).

Trong 2026 không có lý do chọn OpenVPN cho stack mới. Chỉ nhắc để biết bạn nên bỏ qua, không phải để cân nhắc. Nó tốt cho corporate VPN truyền thống, không hợp vibe coder.

WireGuard raw: P2P thuần, bạn config tay

WireGuard là protocol kernel-level, peer-to-peer. Không có khái niệm server. Mỗi cặp peer thiết lập 1 tunnel UDP độc lập, encrypted bằng cặp public/private key kiểu SSH.

Bạn dựng "mạng" bằng cách viết file wg0.conf trên mỗi node, khai báo peer của nó. Với 3 node tam giác (laptop + 2 VPS), bạn cần 3 cặp peer, mỗi node có 2 entry Peer trong config.

Pros: nhanh nhất có thể (kernel mode), không depend SaaS, zero hidden complexity.

Cons: scale tệ. N node = N*(N-1)/2 tunnel khai báo. Thêm node thứ 4 phải edit config trên cả 4 máy. Key rotation thủ công. NAT traversal phải tự xử bằng PersistentKeepalive. Behind CGNAT đối xứng thì fail luôn.

Tailscale: WireGuard + control plane lo phần khó

Tailscale dùng chính xác cùng protocol WireGuard. Khác biệt: thay vì bạn viết file config, có 1 coordination server (do Tailscale chạy, hoặc bạn tự host bằng Headscale) làm 3 việc:

  1. Exchange public key giữa các node (thay cho bạn copy-paste).
  2. Cung cấp DERP relay (server trung gian) khi 2 node không punch được NAT trực tiếp.
  3. Quản lý ACL: ai access được gì.

Coordination server không thấy data traffic. Traffic vẫn end-to-end encrypted giữa 2 node, key bạn vẫn giữ. Server chỉ làm "danh bạ".

Pros: setup 3 phút, NAT traversal mọi case (DERP relay fall back), mobile UX ngon, ACL JSON version control.

Cons: depend coordination server (TS-hosted hoặc self-host Headscale). Free tier giới hạn 6 user và 50 tagged resource. Trên macOS/Windows chạy userspace WG, throughput thấp hơn 10-15% so với kernel WG.

So sánh trực tiếp theo 9 case

Cùng 1 use case, mỗi tool xử lý khác nhau ở UX và độ rắc rối. Cho 3 case quan trọng nhất, đây là chi tiết:

Case 5 (VPS VN ↔ VPS US): test xem có đi qua laptop không?

Đây là câu hỏi mình thấy nhiều người mới hiểu nhầm. Cả WireGuard raw và Tailscale đều mesh thuần - traffic giữa 2 VPS đi thẳng qua cable biển, không qua laptop, với điều kiện config đúng.

WireGuard raw: phải nhớ khai báo pair giữa VPS VN ↔ VPS US trong cả 2 file config của 2 VPS. Quên = tunnel không tồn tại = VPS VN không gọi được VPS US qua IP VPN, packet drop hoặc tệ hơn route nhầm qua laptop (nếu laptop bật ip_forward).

Tailscale: tự động. Bật tailscale up trên cả 2 VPS, mesh tự thiết lập, không lo quên pair.

Verify direct connection trong Tailscale:

tailscale status
# vps-vn   100.x.x.x  direct 1.2.3.4:41641   ← direct = P2P thẳng
# vps-us   100.y.y.y  direct 5.6.7.8:41641   ← không qua DERP
# laptop   100.z.z.z  direct ...

Nếu thấy direct thì traffic P2P, không qua node trung gian nào.

Case 7 (laptop roaming): SSH session sống được không?

WireGuard raw: tunnel break khi laptop đổi network. Có thể workaround bằng mosh (UDP-based SSH, tự reconnect) nhưng phải nhớ mosh vps thay vì ssh vps.

Tailscale: IP VPN của laptop giữ nguyên (100.x.x.x). SSH session sống qua đổi network trong vài giây. Cùng với mosh thì gần như không bao giờ đứt.

Case 6 (test trên phone qua 4G/cafe WiFi): NAT traversal

Điện thoại 4G ở VN thường behind CGNAT của Viettel/VinaPhone. Không có public IP, NAT mapping ngắn hạn.

WireGuard raw: client mode hoạt động (điện thoại dial ra VPS có public IP). Nhưng laptop ↔ điện thoại direct (cả 2 đều behind NAT) thì fail, phải route qua VPS làm relay.

Tailscale: tự fall back DERP relay khi P2P fail, vẫn connect được. User không thấy khác biệt ngoài latency hơi cao hơn.

Bảng tổng so sánh

Tiêu chí OpenVPN WireGuard raw Tailscale
Architecture Client-server Peer-to-peer mesh P2P mesh + coordinator
Throughput ~200-400 Mbps Wire speed (~900+ Mbps trên 1G) Wire speed Linux, -10% macOS/Win
Setup 3 node ~2-3h (CA, cert, push route) ~30 phút (3 file conf) ~3 phút
Add node mới Sign cert mới trên CA Edit config trên tất cả node cũ 1 lệnh trên node mới
NAT traversal UDP/TCP, ổn OK 1 đầu NAT, fail 2 đầu NAT đối xứng OK mọi case nhờ DERP fall back
Roaming (đổi network) Phải reconnect Phải reconnect Tự re-establish vài giây
Mobile app Có (3rd party) Có (WireGuard official) Có, UX tốt nhất, SSO sẵn
VPS-to-VPS qua laptop? Không (qua server) Không (nếu config đủ pair) Không (auto mesh)
Vendor dependency Zero Zero TS coordination (hoặc self-host Headscale)
Cost $0 $0 $0 free tier, $8/user/mo paid
Audit/ACL Cấu hình firewall tay iptables/nftables tay ACL JSON, version control

Setup quick start

WireGuard raw - tam giác 3 node

Cần ít nhất 1 đầu mỗi cặp có public IP reachable. Trong case này 2 VPS đều có public, laptop NAT - đủ điều kiện.

Cài trên cả 3:

# Ubuntu/Debian
sudo apt install wireguard

# macOS
brew install wireguard-tools

Sinh keypair trên mỗi node:

wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey publickey

Trên VPS VN, file /etc/wireguard/wg0.conf:

[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = 

[Peer]
# laptop
PublicKey = 
AllowedIPs = 10.0.0.1/32

[Peer]
# VPS US
PublicKey = 
Endpoint = us.example.com:51820
AllowedIPs = 10.0.0.3/32
PersistentKeepalive = 25

Trên VPS US tương tự, hoán đổi peer. Trên laptop khai báo cả 2 VPS làm peer với Endpoint trỏ tới public IP của VPS.

Bật service:

sudo systemctl enable --now wg-quick@wg0
sudo wg show

Ping kiểm tra:

ping 10.0.0.2   # VPS VN từ laptop
ping 10.0.0.3   # VPS US từ laptop
ssh [email protected]   # SSH thẳng qua VPN

Tailscale - cùng tam giác

Cài trên cả 3:

# Linux
curl -fsSL https://tailscale.com/install.sh | sh

# macOS
brew install --cask tailscale

Bật và đăng nhập:

sudo tailscale up

Lần đầu mở browser auto, login bằng Google/GitHub. Done. Lặp lại trên 3 node.

Check mesh:

tailscale status
ping vps-vn
ping vps-us
ssh vps-us   # MagicDNS auto resolve, không cần nhớ IP

Đó là toàn bộ setup. Không có config file, không khai báo peer.

Quyết định nhanh: nên chọn cái nào

Chọn WireGuard raw nếu:

  • Stack cố định 2-4 node, không hay thay đổi.
  • Anti-SaaS triệt để, muốn 0 vendor dependency.
  • Đã rành iptables/nftables, hứng thú học sâu network.
  • Performance throughput là priority tuyệt đối (vd. backup database 100GB qua tunnel mỗi đêm).
  • Toàn bộ node có public IP hoặc behind NAT simple, không CGNAT khắc nghiệt.

Chọn Tailscale (managed hoặc Headscale self-host) nếu:

  • Stack động: thường xuyên add/remove node, dev/staging/prod nhiều môi trường.
  • Laptop hay đổi network (cafe, 4G, khách sạn, sân bay).
  • Có thiết bị mobile cần access.
  • Solo dev, không có thời gian maintain mesh config.
  • Muốn ACL phân quyền fine-grained khi team scale.
  • Cần MagicDNS để gõ ssh prod thay vì nhớ 10.0.0.3.

Không chọn OpenVPN trong 2026 cho stack mới của vibe coder. Lý do duy nhất giữ OpenVPN là compatibility với corporate VPN cũ.

Trap thường gặp

WireGuard: traffic vô tình route qua laptop

Nếu laptop bật net.ipv4.ip_forward=1 và set AllowedIPs = 10.0.0.0/24 trên cả 2 VPS (thay vì /32 cho từng peer cụ thể), thì khi VPS VN ↔ VPS US chưa có direct tunnel, packet có thể chui qua laptop. Latency gấp đôi, bandwidth nghẽn ở residential internet nhà bạn.

Fix: dùng /32 cho từng peer trong AllowedIPs, không bật ip_forward trên laptop trừ khi bạn cố ý làm relay.

Tailscale: bị fall back DERP mà không biết

Khi NAT punching fail, Tailscale tự dùng DERP relay. Latency cao hơn, throughput giảm. Bạn có thể không nhận ra vì vẫn connect được.

Check: tailscale status - nếu thấy relay tok thay vì direct tức đang đi qua DERP Tokyo. Fix: mở port UDP 41641 trên VPS firewall, hoặc dùng tailscale netcheck để chẩn đoán.

Cả 2: quên revoke key khi máy mất

Laptop bị mất, key WireGuard nằm trên đó vẫn dùng được. Phải revoke bằng cách xóa peer entry trên các node khác (WG raw) hoặc remove device từ admin console (Tailscale).

Tailscale có advantage: revoke 1 chỗ, áp dụng all node. WG raw phải edit từng file.

Lựa chọn của mình cho vibe coder solo

Bắt đầu với Tailscale free tier. 3 phút setup, đủ dùng cho 6 user và 50 tagged resource. Khi nào hit limit hoặc thực sự cần data sovereignty thì migrate sang Headscale self-host (cùng client, đổi mỗi coordinator URL).

WireGuard raw là kỹ năng nền nên học - hiểu cách config tay 1 lần giúp bạn debug Tailscale tốt hơn, biết khi nào DERP relay đang chạy, biết khi nào AllowedIPs sai. Nhưng để dùng hằng ngày làm việc, Tailscale tiết kiệm 95% effort cho cùng kết quả.

OpenVPN cứ skip. 2026 rồi.

Chia sẻ bài viết