WireGuard vs Tailscale vs Headscale: chọn gì?
Tailscale là WireGuard kèm control plane để cấp IP, xuyên NAT và áp dụng policy. So sánh chi phí vận hành, quyền riêng tư và lựa chọn phù hợp cho VPS.
WireGuard và Tailscale: câu trả lời ngắn gọn
WireGuard và Tailscale không phải là lựa chọn giữa hai protocol, vì Tailscale chính là WireGuard. Tailscale dùng cùng cơ chế mã hóa và cùng tunnel, sau đó bổ sung một control plane: coordination server để trao đổi public key, cấp địa chỉ, xuyên NAT (network address translation) và áp dụng access policy. Bạn đang chọn mức độ coordination mà mình muốn tự vận hành.
Có ba câu trả lời rõ ràng. Dùng WireGuard thuần khi bạn có một server và một số ít client cùng kết nối vào server đó. Dùng Tailscale khi bạn muốn mọi máy có thể truy cập lẫn nhau mà không phải duy trì file cấu hình. Dùng Headscale khi bạn muốn mô hình mesh đó nhưng không muốn một bên thứ ba lưu node list.
Lợi ích thực tế của control plane
WireGuard thuần không có cơ chế discovery. Mỗi peer là một đoạn text bạn phải tự viết: public key, một dòng AllowedIPs và một dòng Endpoint nếu peer đó có thể truy cập được. Thêm một máy vào network gồm 10 máy nghĩa là phải sửa 10 file cấu hình, vì mỗi phía cần key của phía còn lại. Vì vậy, gần như mọi setup WireGuard tự host đều dùng mô hình hub và spoke: một server có public IP, còn các client chỉ kết nối đến server đó.
Control plane loại bỏ việc phải sửa thủ công. Mỗi node chỉ cần đăng ký một lần, nhận một địa chỉ trong dải 100.64.0.0/10 CGNAT (carrier grade NAT), rồi nhận public key của các node mà nó được phép truy cập. Tunnel vẫn là kết nối WireGuard trực tiếp giữa 2 peer, và traffic của bạn không đi qua coordination server. Server chỉ lưu metadata: có những node nào, key nào thuộc về node nào và node nào được phép nói chuyện với node nào.
Cơ chế này mang lại 3 lợi ích cụ thể.
NAT traversal. 2 laptop nằm sau 2 router gia đình khác nhau không có public IP để kết nối trực tiếp. Tailscale dùng STUN (session traversal utilities for NAT) để phát hiện địa chỉ và port bên ngoài của mỗi phía. Sau đó, 2 phía gửi packet cùng lúc để mỗi router thấy flow đi ra trước và chấp nhận packet phản hồi. Khi cách này không hoạt động, traffic chuyển sang DERP relay, là một relay được Tailscale vận hành và mã hóa. Data của bạn vẫn được mã hóa end-to-end khi đi qua relay, vì relay không giữ các key. Chạy tailscale status; mỗi dòng peer sẽ hiển thị direct hoặc relay. Chạy tailscale netcheck để xem relay nào gần nhất và network của bạn có cho phép UDP hay không.
Key rotation có thời hạn. WireGuard key không bao giờ hết hạn. Một key được cấp từ 3 năm trước vẫn hoạt động mãi, trừ khi bạn tự xóa block peer. Thay vào đó, Tailscale cho node key hết hạn. Tính đến tháng 10 năm 2026, thời hạn mặc định trên một tailnet mới là 180 ngày. Máy chưa reauthenticate sẽ ngừng kết nối. Bạn có thể tắt thời hạn này riêng cho từng device, chẳng hạn server hoặc subnet router mà không có người đăng nhập thường xuyên.
Policy thay vì routing. Trong WireGuard thuần, AllowedIPs vừa là routing table vừa là access control list. Vì vậy, quy tắc “alice được phép truy cập database” phải được biểu diễn bằng một dải IP. Tailscale lưu một policy file riêng, trong đó các rule gọi tên user, group và tag. Một rule có thể quy định tag:laptop được phép truy cập tag:db trên port 5432 và không được truy cập nơi nào khác. Rule đó vẫn giữ nguyên khi máy nhận địa chỉ mới.
Chi phí của control plane
Máy chủ điều phối biết mạng của bạn. Nó lưu public key của mọi node, tên của mọi node, các địa chỉ đã cấp và policy. Với Tailscale hosted, đó là một công ty nằm ngoài quyền kiểm soát của bạn. Họ không thể đọc các packet của bạn vì WireGuard private key vẫn nằm trên máy của bạn. Tuy nhiên, họ có thể thấy cấu trúc mạng của bạn. Khả năng kết nối của bạn cũng phụ thuộc vào việc service của họ đang hoạt động và tài khoản của bạn vẫn hợp lệ. Mức độ đáng lo đến đâu phụ thuộc vào việc một coordination server bị breach hoặc một identity account bị đánh cắp thực sự có thể làm gì với dữ liệu mà nó đang giữ. Vì vậy, bạn nên đọc đầy đủ trust model của Tailscale.
Có một chi phí thứ hai dễ bị bỏ qua. Tailscale chạy dưới dạng daemon trên mọi máy. Vì vậy, bạn phải cập nhật bản vá cho phần mềm này trên từng máy. WireGuard thuần trên Ubuntu 24.04 là một kernel module đi kèm distribution và được cập nhật cùng kernel.
Chi phí thứ ba là billing. Tính đến October 2026, Personal plan miễn phí với số user device không giới hạn cho tối đa 6 user. Standard có giá $8 cho mỗi user mỗi tháng. Premium có giá $18 cho mỗi user mỗi tháng. Một hộ gia đình vẫn được dùng miễn phí. Một team 10 người thì không. Việc bạn có vượt ngưỡng đó hay không chủ yếu phụ thuộc vào số seat, không phải số device, với một ngoại lệ: server và các tagged device khác có hạn mức riêng. Mọi plan đều bao gồm 50 tagged resource. Tính đến October 2026, pricing page niêm yết mức $1 mỗi tháng cho mỗi resource vượt quá hạn mức đó. Bạn nên đọc phạm vi thực tế của free plan trước khi mời user thứ 7 hoặc tag server thứ 51.
Khi nào plain WireGuard là lựa chọn phù hợp
Chọn plain WireGuard khi topology thực sự là hub và spoke. Bạn có một VPS với public IP, ba hoặc bốn thiết bị kết nối đến đó, và không yêu cầu các thiết bị này truy cập lẫn nhau. Cấu hình chỉ gói gọn trong một màn hình, không có daemon cần cập nhật, không có account có thể bị mất và không có dịch vụ bên ngoài nằm giữa bạn với server.
Đây cũng là lựa chọn phù hợp khi bạn muốn hiểu lớp nền mà mọi thứ khác được xây dựng trên đó. Tự host một WireGuard VPN trên VPS hướng dẫn tạo key, wg0.conf, IP forwarding, NAT và các lỗi handshake. Key và handshake vẫn hoạt động bên dưới mọi tailnet. IP forwarding cũng trở lại ngay khi một tailnet node đóng vai trò subnet router hoặc exit node. Nếu bạn vẫn đang cân nhắc lựa chọn cũ hơn, WireGuard so với OpenVPN trình bày 4 trường hợp OpenVPN vẫn có lợi thế.
Quá trình cài đặt ngắn gọn:
sudo apt update && sudo apt install -y wireguard
sudo modprobe wireguard && echo okPlain WireGuard không còn thuận tiện khi mọi thiết bị đều phải truy cập mọi thiết bị khác. Một full mesh gồm N node cần N lần N trừ 1 peer block. Với 6 thiết bị, bạn phải tự giữ cho 30 block đồng bộ. Một entry AllowedIPs bị trùng sẽ âm thầm chiếm lưu lượng từ peer đã có entry đó trước, và không có lỗi nào được in ra ở bất kỳ đâu.
Khi Tailscale là lựa chọn phù hợp
Chọn Tailscale khi các máy thường xuyên thay đổi mạng. Laptop dùng mạng khách sạn, điện thoại dùng mobile data, hoặc home server nằm sau router mà bạn không kiểm soát. Đây chính là những trường hợp mà WireGuard thuần túy xử lý không tốt, vì không bên nào có public endpoint ổn định để khai báo trong Endpoint.
Cài client bằng một command từ installer chính thức:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale statustailscale up in ra một URL. Mở URL đó, đăng nhập rồi máy sẽ tham gia mạng. Bạn không cần sao chép key và không cần mở inbound port, vì daemon tạo kết nối outbound đến coordination server rồi duy trì kết nối đó. Đây cũng là lý do node Tailscale hoạt động được trên mạng mà bạn hoàn toàn không kiểm soát firewall.
Sau đó, 2 thiết lập đảm nhiệm phần lớn chức năng hữu ích. Subnet router quảng bá toàn bộ LAN vào mạng, nên bạn không phải cài client trên từng thiết bị:
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale set --advertise-routes=192.0.2.0/24Route vẫn không hoạt động cho đến khi bạn approve nó trong admin console. Đây là chủ ý thiết kế: một node không thể tự đưa route vào mạng của bạn. Client Linux cũng cần sudo tailscale set --accept-routes, vì Linux không mặc định chấp nhận các route được quảng bá. Vì vậy, một route có vẻ đã được approve ở phía server vẫn không làm gì trên laptop Linux cho đến khi bạn thiết lập tùy chọn này. Nếu đó là mô hình bạn cần, chạy subnet router trên VPS sẽ hướng dẫn cách approve và cấu hình forwarding theo đúng thứ tự, tránh tạo ra một route chỉ hoạt động một nửa.
Exit node gửi traffic Internet thông thường của client, tức mọi traffic không đi đến một thiết bị khác trong tailnet hoặc một subnet route đã được approve, qua một máy duy nhất. Đây là cơ chế full tunnel mà người dùng thường gọi là “VPN”. Trên Linux, bạn cũng cần các thiết lập IP forwarding như trên trước khi quảng bá exit node:
sudo tailscale set --advertise-exit-nodeFlag đó là phần đơn giản. biến VPS thành exit node trình bày các bước tiếp theo: approve route trong admin console, sau đó xử lý DNS và IPv6 để tránh traffic đi ra sai hướng. Nếu bạn chỉ muốn truy cập một web service thay vì cả mạng, serve và funnel sẽ đặt HTTPS trước một local port duy nhất. Bạn có thể giới hạn dịch vụ trong tailnet hoặc mở cho public Internet.
Khi Headscale là lựa chọn phù hợp
Headscale là một triển khai mã nguồn mở của coordination server và chạy trên VPS do bạn sở hữu. Các Tailscale client chính thức sẽ kết nối đến server này thay vì dịch vụ hosted:
sudo tailscale up --login-server https://headscale.example.comData path không thay đổi. Nó vẫn là WireGuard và vẫn kết nối trực tiếp giữa các peer nếu mạng cho phép. Điểm thay đổi là danh sách node, các key và policy được lưu trong một file SQLite trên disk do bạn sở hữu. Không ai bên ngoài có thể xem cấu trúc mạng của bạn, vô hiệu hóa account hoặc tính phí theo user.
Đổi lại, bạn phải tự vận hành nhiều việc. Bạn đang chạy một HTTPS service public, nên cần DNS name, certificate và reverse proxy xử lý đúng việc chuyển tiếp WebSocket upgrade. Bạn chịu trách nhiệm về uptime của service. Khi coordination server ngừng hoạt động, node mới không thể đăng ký và các node hiện có không thể nhận biết thay đổi. Headscale cũng chưa đạt version 1.0 và các bản minor release từng có breaking change, nên hãy đọc changelog trước mỗi lần upgrade. Chạy Headscale làm Tailscale control server của riêng bạn trình bày cách cài đặt, config.yaml, preauth key và các port cần mở.
Có một điểm cần lưu ý thường chỉ được nhận ra khá muộn. Headscale không đi kèm mạng relay toàn cầu của Tailscale. Khi hai peer không thể kết nối trực tiếp, bạn phải bật relay tích hợp trên server của mình hoặc trỏ config đến một relay khác. Relay đó chỉ là một máy trong một region, không phải một fleet trên toàn thế giới. Các peer ở nửa kia địa cầu sẽ cảm nhận rõ khác biệt này. Nếu không muốn tự lắp phần đó, tự host NetBird là lựa chọn khác để giữ control plane trong hệ thống của bạn, vì quickstart của NetBird khởi chạy cùng lúc các service management, signal và relay trên một VPS. Tuy nhiên, NetBird không phải là Tailscale server có thể thay thế trực tiếp như Headscale: nó có client riêng và model policy riêng. Vì vậy, hãy đọc NetBird và Tailscale khác nhau thế nào về access rule và relay trước khi chọn NetBird thay cho Headscale.
Cách quyết định trong một lần
Hãy xác định có bao nhiêu máy cần kết nối với nhau. Nếu tất cả máy chỉ giao tiếp với server, WireGuard thuần túy sẽ cần ít phần mềm hơn mà vẫn đạt cùng kết quả.
Hãy xác định các máy có địa chỉ public ổn định hay không. Nếu phần lớn máy nằm sau NAT mà bạn không kiểm soát, bạn cần một control plane, vì hole punching là phần khó nhất và không đáng để tự xây dựng lại.
Hãy xác định ai được phép biết cấu trúc mạng của bạn. Nếu câu trả lời là không bao gồm các công ty bên ngoài, hoặc số lượng người dùng khiến việc tính phí theo seat trở nên tốn kém, hãy chạy Headscale và chấp nhận rằng bạn sẽ phải vận hành control server. Nếu chi phí là yếu tố chính thúc đẩy quyết định, hãy tính toán trước khi cam kết migration, vì chi phí thực tế của một team có quy mô như bạn chủ yếu phụ thuộc vào số người có account, không phải số máy bạn chạy, cho đến khi số server được gắn tag vượt quá 50 máy mà mọi plan đều bao gồm; hai con số này hiếm khi gần nhau.
Bạn có thể đổi quyết định với chi phí thấp. Vì data plane dùng cùng một protocol trong cả 3 lựa chọn, chuyển từ WireGuard thuần túy sang coordinated mesh chỉ cần cài client thay vì thiết kế lại hệ thống; chuyển từ Tailscale sang Headscale chỉ cần đăng ký lại từng node với một login server khác.
Những gì cả ba giải pháp đều không cung cấp
Không giải pháp nào trong số này là firewall. Tunnel quyết định packet nào được truyền qua, không quyết định service nào được phép listening. Server có thể truy cập qua tunnel vẫn có thể được truy cập từ Internet trên mọi port mà bạn để mở. Vì vậy, hãy để các rule firewall UFW trên VPS tiếp tục thực hiện nhiệm vụ của chúng. Policy file của Tailscale giới hạn những node khác được phép truy cập đến đâu, nhưng không kiểm soát public interface.
Không giải pháp nào trong số này cung cấp xác thực theo từng service. Chúng cũng không tạo audit trail ghi lại người dùng đã làm gì sau khi kết nối. Hãy xem cả ba chỉ là lớp transport, rồi đặt các bước kiểm tra đăng nhập trong application.
FAQ
Tailscale có phải chỉ là WireGuard với nhiều bước hơn không?
Tailscale sử dụng giao thức WireGuard cho đường truyền dữ liệu, nên cơ chế mã hóa và tunnel là giống nhau. Phần Tailscale bổ sung là coordination: trao đổi key, cấp phát địa chỉ, NAT traversal bằng STUN và relay DERP, hết hạn key, cùng một policy file dùng tên user thay vì dải IP. Với WireGuard thuần, bạn phải tự xử lý các phần này. Chúng trở nên phức tạp khi các máy chuyển qua lại giữa nhiều network.
Traffic của tôi có đi qua server của Tailscale không?
Thông thường là không. Các peer kết nối trực tiếp với nhau sau khi coordination server giới thiệu chúng, và tailscale status hiển thị direct trên các dòng peer đó. Khi không thể thiết lập đường truyền trực tiếp, traffic chuyển sang relay DERP và dòng đó hiển thị relay. Ngay cả khi đó, relay chỉ chuyển các packet đã mã hóa và không giữ private key WireGuard của bạn, nên không thể đọc nội dung. Chạy tailscale netcheck để kiểm tra network của bạn có chặn UDP cần cho kết nối trực tiếp hay không.
Tôi có thể dùng Headscale với các app Tailscale chính thức không?
Có. Headscale sử dụng cùng control protocol, nên các client chính thức tham gia bằng sudo tailscale up --login-server https://headscale.example.com. Bạn cũng có thể trỏ app desktop và mobile đến một login server tùy chỉnh. Tuy nhiên, vị trí cài đặt khác nhau trên từng platform, và các app mobile là những app dễ yêu cầu một version cụ thể nhất. Hãy test một điện thoại trước khi migrate toàn bộ network.
Tôi vẫn cần mở port cho Tailscale hoặc Headscale không?
Tailscale client không cần inbound port, vì client kết nối ra coordination server và giữ connection đó mở. Headscale server tự host cần inbound port: 443 cho control protocol, 80 nếu bạn dùng HTTP-01 certificate challenge, và 3478/udp chỉ khi bật relay tích hợp. WireGuard thuần cần UDP listen port, thường là 51820, được mở trên server và trên mọi network firewall riêng do provider của bạn vận hành.
Trong ba lựa chọn, cái nào nhanh nhất?
Throughput là như nhau vì cả ba đều chuyển packet bằng WireGuard. Khác biệt nằm ở thời gian thiết lập connection và chất lượng đường truyền. WireGuard thuần với Endpoint đúng sẽ luôn kết nối trực tiếp. Tailscale và Headscale thường kết nối trực tiếp, nhưng chuyển sang relay khi network chặn hole punching; đường relay sẽ tăng latency. Đo đường truyền của bạn bằng tailscale ping <node> để biết route là direct hay relayed, hoặc dùng iperf3 qua tunnel. Nếu con số đó thấp hơn nhiều so với line rate trên một đường truyền trực tiếp, nguyên nhân không nằm ở việc chọn giữa ba giải pháp này. Nguyên nhân thường gặp là path MTU mismatch, và lỗi này xảy ra giống nhau dù có hay không có control plane.