Cấu hình VPS làm Tailscale exit node
Biến VPS thành Tailscale exit node: cài đặt, quảng bá node, bật IP forwarding, phê duyệt route trong admin console, rồi xử lý lỗi DNS và IPv6.
Tailscale exit node hoạt động như thế nào
Tailscale exit node là một máy trong tailnet chịu trách nhiệm chuyển tiếp toàn bộ lưu lượng Internet cho các thiết bị khác của bạn. VPS (virtual private server) phù hợp để làm exit node vì có địa chỉ public cố định và luôn hoạt động. Thiết lập exit node gồm 5 bước: cài Tailscale trên server, quảng bá exit node, bật IP forwarding, phê duyệt route trong admin console, rồi chọn node trên laptop. Bước thứ tư là một checkbox trên trang web, không phải command. Đây là bước khiến nhiều người bị mắc lại nhất.
Sau khi bật, laptop sẽ mã hóa mọi packet và gửi chúng đến VPS. VPS thực hiện source NAT (network address translation), rồi gửi packet đi bằng địa chỉ public của chính nó. Website sẽ thấy VPS. Wi-Fi ở quán cà phê chỉ thấy một luồng UDP đã mã hóa đến VPS, không thấy lưu lượng nào khác. Nếu không có exit node, Tailscale chỉ chuyển tiếp traffic giữa các thiết bị của bạn. Mọi website vẫn thấy địa chỉ thật của bạn. Đây là điểm khác biệt quyết định Tailscale có được xem là VPN hay không.
Tailscale dùng WireGuard cho data path, cùng với một coordination server để phân phối key và giúp hai máy tìm thấy nhau qua NAT. Coordination server là lý do không cần sao chép key trong các bước bên dưới. Để xem đầy đủ các đánh đổi, hãy đọc so sánh Tailscale với WireGuard thuần. Nếu muốn tự quản lý mọi thành phần của tunnel, hãy tự host VPN WireGuard thuần trên VPS.
Các bước bên dưới giả định Tailscale đã chạy trên laptop và cả hai máy đều đăng nhập vào cùng một tailnet. Tailnet là mạng Tailscale riêng của bạn. Trừ khi admin đã tắt IPv4 cho mạng này, mọi thiết bị trong đó sẽ nhận một địa chỉ ổn định bên trong 100.64.0.0/10.
Cài đặt Tailscale trên VPS
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upScript cài đặt sẽ chọn package repository phù hợp với distribution của bạn và cài daemon tailscaled. Sau đó, tailscale up sẽ in ra một authentication URL. Mở URL này trong trình duyệt và đăng nhập bằng cùng tài khoản mà laptop của bạn đang dùng, vì VPS đăng nhập vào tailnet khác sẽ không thể phục vụ laptop của bạn.
tailscale status
tailscale ip -4Lúc này, tailscale status sẽ liệt kê cả hai máy. tailscale ip -4 sẽ in địa chỉ tailnet của VPS. Bạn sẽ cung cấp địa chỉ này cho client ở bước sau.
Tailscale cần một thiết bị TUN để tạo tunnel. Trên VPS KVM, thiết bị này đã có sẵn. Với các gói sử dụng container virtualisation và dùng chung kernel của host, đôi khi /dev/net/tun bị thiếu, khiến tailscaled không thể tạo interface tailscale0. Chạy ls -l /dev/net/tun trước khi tiếp tục.
Bật IP forwarding, nếu không VPS sẽ loại bỏ mọi packet
Máy Linux loại bỏ mọi packet không được gửi đến chính nó vì net.ipv4.ip_forward mặc định có giá trị 0. Exit node sẽ nhận traffic của bạn, giải mã rồi loại bỏ. Ghi thiết lập này vào file để nó vẫn còn sau khi reboot.
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.conftee -a dùng chế độ append, nên chạy lại các dòng này sẽ ghi cả hai thiết lập hai lần. Kết quả vẫn hoạt động, nhưng cat /etc/sysctl.d/99-tailscale.conf sẽ trông bất thường. Hãy xác nhận giá trị đang có hiệu lực thay vì chỉ tin vào file:
sysctl net.ipv4.ip_forwardLệnh phải in ra net.ipv4.ip_forward = 1. Nếu bỏ qua bước này và dùng tailscale up --advertise-exit-node, client sẽ báo:
Warning: IP forwarding is disabled, subnet routing/exit nodes will not work.tailscale set --advertise-exit-node không thực hiện kiểm tra đó, nên việc set không trả về gì không chứng minh forwarding đã được bật. Hãy tự đọc giá trị sysctl.
Bạn không cần tự viết masquerade rule. tailscaled tự tạo các firewall chain có tên ts-input, ts-forward và ts-postrouting, còn NAT rule cho traffic của exit node nằm trong ts-postrouting. Xem chúng bằng sudo iptables-save | grep ts-, hoặc dùng sudo nft list ruleset trên máy chạy nftables.
Quảng bá VPS làm exit node
sudo tailscale set --advertise-exit-nodetailscale set chỉ thay đổi một tùy chọn và giữ nguyên các tùy chọn khác. tailscale up --advertise-exit-node cũng quảng bá node, nhưng có một tác động phụ: up coi các flag trên CLI là toàn bộ nhóm thiết lập không mặc định. Vì vậy, lần chạy sudo tailscale up không kèm tham số sau đó sẽ bị từ chối và in ra
changing settings via 'tailscale up' requires mentioning all
non-default flags. To proceed, either re-run your command with --reset or
use the command below to explicitly mention the current value of
all non-default settings:Dùng set cho các thay đổi tiếp theo để không gặp thông báo đó.
Quảng bá chỉ là một đề nghị. VPS hiện thông báo cho coordination server rằng nó sẵn sàng làm exit node. Chưa client nào có thể sử dụng nó.
Phê duyệt exit node Tailscale trong admin console
Đây là bước không có command tương ứng. Mở trang Machines trong admin console và tìm VPS. VPS lúc này sẽ hiển thị badge Exit Node. Mở menu của thiết bị đó, chọn Edit exit node, đánh dấu vào ô Use as exit node, rồi chọn Save.
Cho đến khi bạn đánh dấu và lưu ô này, control plane chỉ giữ yêu cầu và không cấp yêu cầu đó cho thiết bị nào. tailscale exit-node list trên laptop của bạn không hiển thị gì, và traffic vẫn đi theo route thông thường. Cả hai máy đều không hiển thị thông báo lỗi. Exit node đơn giản là không bao giờ xuất hiện.
Bạn có thể tự động phê duyệt exit node bằng một entry trong file policy của tailnet:
"autoApprovers": {
"exitNode": ["tag:exit"],
}Thiết bị được khởi chạy bằng --advertise-tags=tag:exit sẽ tự động được phê duyệt, miễn là tag:exit được định nghĩa bên dưới tagOwners trong cùng file policy. Việc gắn tag thay đổi quyền sở hữu: thiết bị được gắn tag thuộc về tailnet thay vì tài khoản người dùng của bạn, đồng thời các access rule áp dụng cho thiết bị cũng thay đổi theo. Với một VPS đơn lẻ, dùng checkbox sẽ đơn giản hơn.
Chọn exit node trên laptop
Trên client Linux:
tailscale exit-node list
sudo tailscale set --exit-node=vps.your-tailnet.ts.netexit-node list hiển thị các exit node đã được phê duyệt trong tailnet cùng với địa chỉ của chúng. Danh sách trống nghĩa là bước phê duyệt chưa được thực hiện. Trên macOS, Windows, iOS và Android, lựa chọn tương tự nằm trong mục Exit Node của ứng dụng Tailscale.
Xác minh từ client, không kiểm tra từ server:
curl -4 https://ifconfig.meChạy lệnh này một lần trước khi chọn exit node và một lần sau đó. Địa chỉ phải thay đổi từ địa chỉ local của bạn sang public IP của VPS. Để dừng sử dụng exit node:
sudo tailscale set --exit-node=Có thêm một flag cần thiết ngay từ đầu. Khi đã chọn exit node, client sẽ gửi mọi thứ qua tunnel, kể cả các packet gửi đến 192.168.1.50, nên máy in và network storage của bạn sẽ không còn phản hồi. Giữ network local trên route local:
sudo tailscale set --exit-node=<name> --exit-node-allow-lan-access=trueVì sao DNS thay đổi ngay khi bật exit node
Theo mặc định, thiết bị sử dụng exit node cũng sử dụng exit node đó làm DNS (domain name system) resolver cho mọi domain. Điều này ghi đè lên các nameserver global và split DNS đã cấu hình cho tailnet. Đây là hành vi có chủ đích. Nếu query vẫn được gửi đến resolver của mạng local, router của quán cà phê vẫn thấy tên mọi site bạn truy cập, dù traffic đã được bảo mật. Tên miền và packet nên rời mạng từ cùng một nơi.
Điều này gây vấn đề cho những người chạy resolver nội bộ: nameserver của tailnet mà bạn phụ thuộc vào sẽ ngừng được sử dụng khi exit node đang bật. Bật Use with exit node cho nameserver đó trên trang DNS của admin console để sử dụng lại nameserver này.
Tên MagicDNS vẫn hoạt động, vì Tailscale client trả lời chúng cục bộ tại 100.100.100.100 trước khi bất kỳ thứ gì đến exit node. Kiểm tra bằng dig @100.100.100.100 your-vps.your-tailnet.ts.net, hoặc trên client dùng systemd-resolved bằng resolvectl status. Khi đó, interface Tailscale sẽ liệt kê 100.100.100.100 là DNS server của nó.
Nếu tắt cơ chế xử lý DNS của Tailscale bằng --accept-dns=false, client sẽ tiếp tục sử dụng resolver mà nó nhận được từ mạng local. Traffic được tunnel, còn query thì không. Đây chính là DNS leak tương tự xảy ra với các WireGuard tunnel tự dựng. Không thay đổi --accept-dns trừ khi bạn có lý do cụ thể.
IPv6 qua exit node
Một exit node quảng bá cả hai default route, 0.0.0.0/0 và ::/0. Nếu VPS không có đường IPv6 hoạt động ra Internet, các gói IPv6 sẽ đến qua tunnel rồi dừng tại đó. Hãy kiểm tra trên VPS trước khi tin dùng:
ip -6 addr show
curl -6 https://ifconfig.meNếu request không thể kết nối, VPS không có đường IPv6 hoạt động ra ngoài. Nếu curl báo "Could not resolve host", lỗi nằm ở name resolution chứ không phải IPv6. Khi đó, hãy sửa DNS trên VPS rồi chạy lại bài kiểm tra. Các website dual stack thường vẫn tải được, vì client hỗ trợ Happy Eyeballs, trong đó có curl, sẽ bắt đầu thử IPv4 song song khi lần thử IPv6 chưa kết nối sau một khoảng chờ ngắn, rồi giữ kết nối nào thành công trước. curl chờ 200 milliseconds theo mặc định, nên khoảng chờ này chỉ làm tăng độ trễ của các kết nối mới thay vì gây lỗi. Các đích chỉ có IPv6 vẫn không thể truy cập.
Phần còn lại là forwarding. net.ipv4.ip_forward = 1 khi net.ipv6.conf.all.forwarding vẫn để ở 0 sẽ tạo đường IPv4 hoạt động nhưng biến IPv6 thành black hole. Người dùng sẽ thấy hiện tượng "một số website tải chậm" thay vì một lỗi dễ tìm kiếm. Cả hai dòng này phải nằm trong file sysctl.
VPS có nên quảng bá cả các route subnet không?
Exit node chuyển toàn bộ lưu lượng Internet qua VPN. Route subnet chuyển một dải mạng riêng nằm phía sau máy đang quảng bá route đó. Đây là hai tính năng độc lập và cần phê duyệt riêng; một máy có thể sử dụng cả hai. Cả hai đều không expose service đang chạy trực tiếp trên VPS. Vì vậy, nếu mục tiêu thực tế của bạn là tạo URL HTTPS cho một app trên server đó, serve và funnel mới là các tính năng bạn cần dùng.
sudo tailscale set --advertise-routes=10.0.0.0/24Hãy quảng bá một subnet khi VPS dùng chung mạng riêng với các server khác mà bạn muốn truy cập bằng địa chỉ private của chúng. Phê duyệt route này trong dialog riêng, không dùng dialog của exit node: trên trang Machines, chọn VPS, đi đến phần Subnets, chọn Edit để mở Edit subnet routes, chọn route, rồi chọn Save. Client Linux sẽ bỏ qua route đã quảng bá cho đến khi bạn truyền --accept-routes. Đây là một trong những điểm khác biệt mà hướng dẫn subnet router giải thích đầy đủ.
Hãy chọn dải mạng cẩn thận. Sau khi route được phê duyệt, laptop chấp nhận route đó (Windows, macOS, iOS và Android mặc định chấp nhận; Linux cần --accept-routes) có thể gửi lưu lượng của dải mạng đó vào tunnel. Nếu phê duyệt 192.168.1.0/24 từ VPS, trong khi laptop ở mạng gia đình cũng dùng cùng dải mạng, các địa chỉ đó có thể bị chuyển vào tunnel và các thiết bị trên bàn làm việc của bạn sẽ mất kết nối. Hãy dùng dải mạng do bạn chọn, không dùng dải mạng mà router gia đình tự chọn.
Tăng tốc exit node bằng UDP GRO forwarding
Tailscale 1.54 trở lên, khi chạy trên kernel Linux 6.2 trở lên, có thể dùng cơ chế receive offload để tăng throughput cho lưu lượng được forward. GRO (generic receive offload) gộp các packet đến trước khi kernel xử lý từng packet. Tính đến tháng 10 năm 2026, trên exit node đây vẫn là bước cấu hình thủ công.
sudo apt install -y ethtool
NETDEV=$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list offip -o route get 8.8.8.8 cho biết interface thực sự kết nối ra Internet, nên bạn không cần đoán giữa eth0, ens3 và enp1s0. Xác nhận bằng ethtool -k $NETDEV | grep udp-gro-forwarding; kết quả lúc này phải là on. GRO chỉ giúp khi path vốn đã hoạt động ổn định. Nếu exit node vẫn chậm sau đó, hãy đo chính path này theo cách tương tự như khi kiểm tra một tunnel WireGuard đơn giản chạy chậm hơn đường truyền bên dưới.
Thiết lập này sẽ mất sau khi reboot. Trên hệ thống chạy networkd-dispatcher, hãy tự động hóa như sau:
printf '#!/bin/sh\n\nethtool -K %s rx-udp-gro-forwarding on rx-gro-list off \n' "$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")" | sudo tee /etc/networkd-dispatcher/routable.d/50-tailscale
sudo chmod 755 /etc/networkd-dispatcher/routable.d/50-tailscaleTrước tiên, kiểm tra /etc/networkd-dispatcher/routable.d/ có tồn tại. Nếu không có, máy không chạy networkd-dispatcher. Khi đó, một systemd unit chạy dòng ethtool lúc boot sẽ thực hiện công việc tương tự.
Ý nghĩa của chính sách sử dụng chấp nhận được của nhà cung cấp đối với traffic đi ra
Mọi packet mà client gửi qua exit node đều đi ra bằng public IP của VPS, nên traffic đó được quy cho account của bạn. Các báo cáo abuse sẽ gửi đến hộp thư của bạn: thông báo bản quyền, khiếu nại về port scan. Hãy đọc AUP (acceptable use policy) của nhà cung cấp trước khi định tuyến traffic của một hộ gia đình hoặc một nhóm qua cùng một server. Không mở exit node cho những người mà bạn không thể xác minh.
Bandwidth chỉ được tính một lần trên chiều đi ra. Mỗi byte đi qua exit node đều đi qua VPS 2 lần: đi vào một phía và đi ra phía còn lại. Với hầu hết gói VPS, chỉ chiều đi ra được tính. Tính đến tháng 10 năm 2026, SSD Nodes ghi rõ hạn mức của mọi gói KVM dưới dạng outbound transfer, từ 4TB đến 48TB mỗi tháng. Tài liệu của Vultr cũng nêu rằng traffic đi vào không được tính. Khi download, đoạn được tính là đường truyền từ VPS qua tunnel xuống laptop của bạn. Khi upload, đó là đường truyền từ VPS ra Internet. Dù theo hướng nào, mọi traffic bạn định tuyến qua exit node cũng chỉ tính vào hạn mức 1 lần. Một video stream được xem qua exit node có thể chiếm nhiều bandwidth hơn bạn nghĩ. Hãy kiểm tra gói của chính bạn, vì nhà cung cấp tính cả 2 chiều sẽ tính stream đó 2 lần.
Các dải địa chỉ của datacenter cũng có reputation riêng. Một số website hiển thị nhiều CAPTCHA hơn cho các địa chỉ này. Một số dịch vụ streaming từ chối các địa chỉ đó hoàn toàn. Không cấu hình nào của bạn thay đổi được điều này, vì đây là thuộc tính của address block mà nhà cung cấp sở hữu.
Vì sao lưu lượng vẫn đi qua kết nối local của bạn
Exit node đã được quảng bá nhưng chưa được phê duyệt. tailscale exit-node list trên client không in ra gì và cả hai máy đều không ghi log lỗi. Mở trang Machines, chọn Edit exit node trong menu của VPS, chọn Use as exit node, rồi chọn Save.
Client chưa chọn exit node đó. Việc phê duyệt chỉ làm node khả dụng trong tailnet. Mỗi thiết bị vẫn phải chọn node riêng. Chạy lại sudo tailscale set --exit-node=<name>, rồi kiểm tra lại curl -4 https://ifconfig.me.
Forwarding đang tắt. Triệu chứng rất rõ: tailscale ping <vps> chạy thành công, tunnel đã hoạt động, nhưng mọi địa chỉ bên ngoài đều timeout. sysctl net.ipv4.ip_forward trả về 0. Sửa file sysctl, rồi chạy sudo sysctl -p /etc/sysctl.d/99-tailscale.conf.
Firewall loại bỏ các packet được forward. tailscaled tự chèn chain ts-forward, và trên VPS mới cài thì như vậy là đủ. Máy đã chạy ufw hoặc Docker có thể có FORWARD policy là DROP, với các rule được xử lý trước rule của Tailscale. Đừng đoán firewall nào gây ra lỗi: chạy sudo iptables -L FORWARD -n -v trong khi client thử tải một trang, rồi theo dõi counter nào tăng. Trên máy chạy ufw, cách sửa thường dùng là DEFAULT_FORWARD_POLICY="ACCEPT" trong /etc/default/ufw, sau đó chạy sudo ufw reload. Đồng thời kiểm tra network firewall của nhà cung cấp trong control panel, vì đó là một lớp kiểm soát riêng với mọi thứ đang chạy trên server.
Kết nối hoạt động nhưng chậm. Chạy tailscale netcheck trên cả hai máy. Nếu kết quả báo UDP bị chặn, hai thiết bị không thể tạo đường truyền trực tiếp và sẽ fallback sang relay DERP, làm tăng độ trễ của mọi kết nối. Cho phép UDP inbound trên port 41641 đến VPS trong network firewall của nhà cung cấp thường sẽ khôi phục đường truyền trực tiếp.
Khi nào nên rời coordination server của Tailscale
Toàn bộ nội dung trên phụ thuộc vào coordination server do Tailscale host để trao đổi key và xử lý phê duyệt mà bạn đã thực hiện. Traffic của bạn đi trực tiếp từ laptop đến VPS, hoặc qua một trong các relay DERP của Tailscale khi không thể thiết lập đường truyền trực tiếp. Coordination server không truyền traffic đó, nhưng server này quyết định ai được tham gia tailnet và mỗi thiết bị được phép truy cập những gì. Chi phí hiếm khi là lý do cần chuyển đổi, vì gói miễn phí hỗ trợ 6 người dùng với số thiết bị riêng không giới hạn, nên hãy cân nhắc bản thân dependency thay vì chỉ nhìn vào hóa đơn. Người thứ 7 là điểm bắt đầu thay đổi. Vì Tailscale tính phí theo user thay vì theo device, hãy tính trước một hộ gia đình hoặc team 5 người thực sự phải trả bao nhiêu trước khi quyết định dựa trên chi phí. Đánh giá một cách thực tế nghĩa là phải biết một coordination server bị compromise hoặc một identity account bị đánh cắp thực sự có thể truy cập đến đâu. Nội dung này được giải thích trong trust model của Tailscale. Nếu dependency đó là thứ bạn muốn loại bỏ, hãy chạy Headscale làm control server Tailscale của riêng bạn và trỏ cả hai client vào server đó. Các bước cấu hình exit node sau đó không thay đổi; bạn sẽ thực hiện phê duyệt route bằng command line của Headscale thay vì hosted console. Headscale thay thế control plane nhưng vẫn sử dụng các client Tailscale. Nếu bạn muốn tự vận hành toàn bộ stack, NetBird cung cấp coordination server riêng và các client để bạn host trên một VPS.
FAQ
Tại sao lưu lượng của tôi vẫn dùng kết nối cục bộ sau khi tôi chọn exit node?
Có 2 nguyên nhân phổ biến. Exit node đã được quảng bá nhưng chưa được phê duyệt: mở trang Machines trong admin console, tìm VPS, chọn Edit exit node từ menu của máy, chọn Use as exit node rồi chọn Save. Việc phê duyệt được thực hiện trong console; không có command nào trên server thực hiện thao tác này. Nguyên nhân thứ hai khác: IP forwarding đang tắt, nên tunnel được thiết lập, tailscale ping đến VPS hoạt động, nhưng mọi địa chỉ bên ngoài đều timeout. Kiểm tra bằng sysctl net.ipv4.ip_forward; kết quả phải là 1.
Tôi có phải phê duyệt exit node thủ công mỗi lần không?
Việc phê duyệt chỉ cần thực hiện 1 lần cho mỗi máy. Nếu bạn thường xuyên rebuild VPS, thêm một block autoApprovers vào file policy của tailnet, chứa "exitNode": ["tag:exit"], định nghĩa tag:exit bên dưới tagOwners, rồi đưa node lên bằng --advertise-tags=tag:exit. Thiết bị được gắn tag thuộc về tailnet thay vì user account của bạn, nên các access rule áp dụng cho thiết bị đó cũng thay đổi.
Laptop của tôi dùng DNS server nào khi exit node đang bật?
DNS server của chính exit node. Thiết bị sử dụng exit node sẽ gửi toàn bộ DNS query đến đó. Điều này ghi đè các nameserver global DNS và split DNS được thiết lập cho tailnet. Mạng cục bộ sẽ không thấy các tên miền bạn tra cứu. Để tiếp tục áp dụng một nameserver của tailnet, bật Use with exit node cho nameserver đó trên trang DNS của admin console. Tên MagicDNS vẫn được resolve vì Tailscale client trả lời chúng cục bộ tại 100.100.100.100.
Một VPS có thể đồng thời là exit node và subnet router không?
Có. sudo tailscale set --advertise-exit-node và sudo tailscale set --advertise-routes=10.0.0.0/24 hoạt động độc lập, và mỗi tính năng được phê duyệt trong dialog riêng: exit node được phê duyệt qua Edit exit node trong menu của thiết bị trên trang Machines; subnet được phê duyệt qua Edit trong mục Subnets của thiết bị, thao tác này mở Edit subnet routes. Cả 2 đều cần bật IP forwarding trên VPS. Tránh quảng bá một range trùng với mạng gia đình của laptop, vì sau khi route đó được phê duyệt và laptop chấp nhận, nó có thể lấy các địa chỉ đó khỏi mạng cục bộ, khiến các thiết bị trong mạng cục bộ không thể truy cập được.
Exit node có ẩn lưu lượng của tôi khỏi nhà cung cấp VPS không?
Không. Tunnel kết thúc tại VPS, nên lưu lượng rời server dưới dạng mà đích yêu cầu. Nhà cung cấp của bạn sẽ truyền lưu lượng ở dạng plain text tại những nơi mà chính website không mã hóa. Exit node chuyển điểm mà lưu lượng của bạn tham gia Internet từ mạng nơi bạn đang kết nối sang server bạn thuê. Nó ẩn hoạt động duyệt web của bạn khỏi Wi-Fi tại quán cà phê và ISP tại nhà, nhưng hoạt động duyệt web đó vẫn hiển thị với nhà cung cấp VPS cùng với tên account của bạn.