SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-25

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.

Control plane thực sự mang lại gì

WireGuard thuần không có cơ chế discovery. Mỗi peer là một đoạn cấu hình 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 mười máy nghĩa là phải sửa mười file cấu hình, vì mỗi phía cần key của phía còn lại. Đó là lý do hầu hết setup WireGuard tự host đều dùng mô hình hub-and-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 đă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 được cung cấp public key của những node mà nó được phép truy cập. Tunnel vẫn là kết nối WireGuard trực tiếp giữa hai peer, và traffic của bạn không bao giờ đi qua coordination server. Server chỉ truyền metadata: node nào tồn tại, key nào thuộc về node đó, và node nào được phép nói chuyện với node nào.

Cơ chế này mang lại ba lợi ích cụ thể.

NAT traversal. Hai laptop đứng sau hai home router khác nhau không có public IP chung để 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 đó hai phía gửi packet cùng lúc để mỗi router thấy flow đi ra trước và chấp nhận reply. Nếu cách này không thành công, traffic sẽ chuyển sang DERP relay, là một relay được Tailscale vận hành và mã hóa. Dữ liệu của bạn vẫn được mã hóa end-to-end khi đi qua relay, vì relay không bao giờ có 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.

Xoay vòng key kèm thời hạn hết hiệu lực. Key của WireGuard không tự hết hạn. Một key được cấp từ ba 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 July 2026, thời hạn mặc định trên 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 hết hiệu lực cho từng thiết bị, chẳng hạn server hoặc subnet router mà sẽ không có người đăng nhập trực tiếp.

Policy thay cho routing. Trong WireGuard thuần, AllowedIPs vừa là routing table vừa là access control list, nên 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 policy trong một 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 gì khác; rule đó vẫn giữ nguyên khi máy nhận địa chỉ mới.

Chi phí của control plane

Coordination server 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, coordination server thuộc về một công ty nằm ngoài quyền kiểm soát của bạn. Công ty đó không thể đọc các packet của bạn vì WireGuard private key vẫn nằm trên các 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à account của bạn vẫn hợp lệ. Mức độ ảnh hưởng của vấn đề này 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ữ. Mô hình trust của Tailscale đáng để đọc đầy đủ tại đây.

Có một chi phí thứ hai dễ bị bỏ sót. Tailscale chạy dưới dạng daemon trên mọi máy. Vì vậy, bạn phải giữ cho phần mềm này được patch trên từng máy. WireGuard thuần trên Ubuntu 24.04 là một kernel module được phân phối cùng hệ điều hành và được cập nhật cùng kernel.

Chi phí thứ ba là billing. Tính đến July 2026, Personal plan miễn phí với số 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, còn 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 gồm 10 người thì không. Việc bạn có vượt qua giới hạn đó hay không phụ thuộc vào số seat chứ không phải số device. Bạn nên đọc free plan thực sự bao gồm những gì trước khi mời user thứ 7.

Khi plain WireGuard là lựa chọn phù hợp

Chọn plain WireGuard khi topology thực sự là hub và spoke. Một VPS có 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ỉ nằm gọn trên 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 đứng 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 trình bày cách tạo key, wg0.conf, IP forwarding, NAT và các lỗi handshake. Tất cả cơ chế này vẫn chạy bên dưới một tailnet. 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 bốn trường hợp OpenVPN vẫn có lợi thế.

Quá trình cài đặt ngắn:

sudo apt update && sudo apt install -y wireguard
sudo modprobe wireguard && echo ok

Plain WireGuard bắt đầu trở nên khó quản lý khi mọi thiết bị đều phải truy cập mọi thiết bị khác. Full mesh gồm N node cần N lần N trừ một peer block. Với sáu thiết bị, bạn phải tự đồng bộ ba mươi block. Một entry AllowedIPs bị lặp có thể âm thầm chuyển traffic khỏi peer đã có entry đó trước, và không có lỗi nào được in ra.

Khi nào 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. Ví dụ: laptop trên mạng khách sạn, điện thoại dùng dữ liệu di động 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ó endpoint public ổn định để đặt vào 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 status

tailscale 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à cũng không cần mở inbound port, vì daemon tạo một kết nối outbound đến coordination server rồi giữ kết nối đó mở. Đâ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 đó, hai thiết lập sẽ xử lý phần lớn nhu cầu. Subnet router quảng bá toàn bộ LAN vào network, 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/24

Route vẫn không hoạt động cho đến khi bạn approve trong admin console. Đây là chủ ý thiết kế: một node không thể tự đưa route vào network của bạn. Linux client cũng cần sudo tailscale set --accept-routes, vì Linux mặc định không chấp nhận route được quảng bá. Do đó, dù route hiển thị là đã được approve ở phía server, nó vẫn không có tác dụng trên laptop Linux cho đến khi bạn thiết lập tùy chọn này. Nếu đây là mô hình bạn cần, chạy subnet router trên VPS sẽ hướng dẫn lần lượt bước approve và các thiết lập forwarding để tránh tình trạng route hoạt động không đầy đủ.

Exit node gửi toàn bộ traffic của client qua một máy, tạo ra kiểu full tunnel mà người dùng thường gọi là “VPN”:

sudo tailscale set --advertise-exit-node

Flag đó là phần đơn giản. biến VPS thành exit node hướng dẫn các bước tiếp theo: approve route trong admin console, sau đó xử lý DNS và IPv6 để traffic không đi ra sai hướng. Nếu bạn chỉ muốn truy cập một web service thay vì toàn bộ network, serve và funnel sẽ đặt HTTPS trước một local port duy nhất, với phạm vi chỉ 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.com

Data 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 thường chỉ được chú ý khi đã quá muộn. Headscale không đi kèm global relay network 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 duy nhất, không phải một fleet trên toàn thế giới. Các peer ở phía bên kia hành tinh sẽ nhận thấy sự khác biệt này. Nếu không muốn tự lắp rá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 động management, signal và relay service cùng lúc trên một VPS.

Cách quyết định trong một lần

Hãy hỏi có bao nhiêu máy cần kết nối với nhau. Nếu tất cả máy chỉ cần giao tiếp với server, WireGuard thuần túy sẽ dùng ít phần mềm hơn mà vẫn đạt cùng kết quả.

Hãy hỏi 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ó và không đáng để tự xây dựng lại.

Hãy hỏi ai được phép biết cấu trúc mạng của bạn. Nếu câu trả lời 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 khó chịu, hãy chạy Headscale và chấp nhận rằng từ đó bạn phải vận hành control server. Nếu phí là yếu tố 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ế cho một team có quy mô như bạn phụ thuộc vào số người có account chứ không phải số máy bạn chạy, và 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ả ba phương án, chuyển từ WireGuard thuần túy sang mesh có điều phối 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.