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 làm gì
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 online. Thiết lập 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ứ 4 là một toggle 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 mã hóa từng packet và gửi đến VPS. VPS áp dụng source NAT (network address translation), rồi gửi packet đi bằng địa chỉ public của chính nó. Website chỉ thấy VPS. Wi-Fi ở quán cà phê chỉ thấy một encrypted UDP flow đến VPS và không thấy gì khác.
Tailscale sử 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 này là lý do không cần sao chép key ở bất kỳ bước nào bên dưới. Để xem đầy đủ các đánh đổi, hãy đọc cách Tailscale và WireGuard thuần so sánh với nhau. Nếu muốn tự quản lý toàn bộ 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. Mỗi thiết bị trong mạng này 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, tìm VPS, mở menu ba dấu chấm ở cuối hàng của VPS, chọn Edit route settings, rồi bật Use as exit node.
Cho đến khi bật tùy chọn này, control plane vẫn giữ yêu cầu và không cấp nó cho thiết bị nào. tailscale exit-node list trên laptop của bạn sẽ không hiển thị gì, đồng thời 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 mục trong file policy của tailnet:
"autoApprovers": {
"exitNode": ["tag:exit"],
}Thiết bị được đưa lên 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 sẽ 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, và các access rule áp dụng cho thiết bị đó cũng thay đổi theo. Với một VPS đơn lẻ, bật tùy chọn này đơ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 đến Internet, các gói IPv6 sẽ đi qua tunnel rồi dừng tại đó. Hãy kiểm tra trên VPS trước khi sử dụng:
ip -6 addr show
curl -6 https://ifconfig.meRequest thất bại nghĩa là VPS không có upstream IPv6. Các website dual stack thường vẫn tải được, vì client sẽ bỏ qua IPv6 và thử lại qua IPv4. Tuy nhiên, lần retry này làm tăng độ trễ khi kết nối lần đầu đến mỗi website. Các đích chỉ hỗ trợ IPv6 vẫn không thể truy cập.
Phần còn lại là forwarding. net.ipv4.ip_forward = 1 với net.ipv6.conf.all.forwarding vẫn để ở mức 0 sẽ tạo ra đườ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 này là "một số website tải chậm" thay vì một lỗi có thể dễ dàng tìm kiếm. Cả hai dòng phải được thêm vào file sysctl.
VPS có nên quảng bá cả các route subnet không?
Exit node mang toàn bộ lưu lượng Internet. Route subnet mang 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 riêng, cần phê duyệt riêng, và một máy có thể dùng cả hai. Không tính năng nào expose service đang chạy trên chính VPS. Vì vậy, nếu mục tiêu thực tế của bạn là có một URL HTTPS cho app trên server đó, serve và funnel 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 trong cùng panel Edit route settings, bằng toggle riêng của subnet. Sau đó, các client Linux vẫn bỏ qua route đã quảng bá cho đến khi bạn truyền --accept-routes. Đây là một trong những khác biệt được trình bày đầy đủ trong hướng dẫn về subnet router.
Hãy chọn dải mạng cẩn thận. Route đã quảng bá cụ thể hơn default route trên laptop của bạn. Vì vậy, nếu quảng bá 192.168.1.0/24 từ VPS, route này sẽ chiếm quyền xử lý các địa chỉ của mạng gia đình dùng cùng dải đó, khiến các thiết bị trên bàn làm việc của bạn 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à home router tự chọn.
Tăng tốc exit node bằng chuyển tiếp UDP GRO
Tailscale 1.54 trở lên, chạy trên kernel Linux 6.2 trở lên, có thể dùng receive offload để tăng throughput cho traffic được chuyển tiếp. GRO (generic receive offload) gộp các packet đến trước khi kernel xử lý từng packet. Tính đến tháng 8 năm 2026, đây vẫn là bước phải cấu hình thủ công trên exit node.
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 báo cáo 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 một 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 thuần chạy chậm hơn đường truyền bên dưới nó.
Thiết lập này 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 này không chạy networkd-dispatcher. Một systemd unit nhỏ chạy dòng ethtool khi boot sẽ thực hiện cùng công việc.
Ý 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 lưu lượng đi qua exit node
Mọi packet mà client gửi qua exit node đều đi ra ngoài với địa chỉ IP public của VPS, nên hoạt động đó được ghi nhận cho account của bạn. Báo cáo abuse sẽ được gửi vào hộp thư của bạn, chẳng hạn thông báo vi phạm bản quyền hoặc 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 lưu lượng 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 hoặc chịu trách nhiệm.
Băng thông được tính hai lần. Traffic đi vào VPS qua tunnel rồi lại đi ra Internet, và cả hai chiều thường đều bị tính vào dung lượng transfer của gói dịch vụ. Một video stream được xem qua exit node có thể chiếm nhiều dung lượng hơn bạn dự tính.
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, còn một số streaming service từ chối hoàn toàn. Không thiết lập nào của bạn thay đổi được điều đó, vì đây là đặc tính của address block thuộc quyền sở hữu của nhà cung cấp.
Vì sao lưu lượng vẫn đi qua kết nối cục bộ 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 gì và cả hai máy cũng không ghi lỗi. Mở trang Machines và bật Use as exit node.
Client chưa chọn exit node đó. Việc phê duyệt chỉ làm cho node khả dụng trong tailnet. Chọn node là thao tác riêng trên từng thiết bị. Chạy lại sudo tailscale set --exit-node=<name>, sau đó kiểm tra lại curl -4 https://ifconfig.me.
Tính năng forwarding đang tắt. Triệu chứng rất cụ thể: tailscale ping <vps> thành công, tunnel đã hoạt động rõ rà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, sau đó 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 một VPS mới cấu hình như vậy là đủ. Một máy đã chạy ufw hoặc Docker có thể có FORWARD policy là DROP, đồng thời các rule của nó được đặt 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 thay đổi. 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ả cho biết UDP bị chặn, hai thiết bị không thể tạo đường truyền trực tiếp và phải chuyển sang relay DERP, làm tăng latency của mọi kết nối. Cho phép inbound UDP 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ộ phần trên phụ thuộc vào coordination server do Tailscale vận hành để trao đổi key và xác nhận phê duyệt mà bạn đã bấm. Traffic của bạn vẫn đi thẳng từ laptop đến VPS. Coordination server không truyền traffic đó, nhưng nó quyết định ai được tham gia tailnet và mỗi thiết bị được phép truy cập những gì. Giá hiếm khi là lý do để chuyển sang giải pháp khác, vì free plan cho phép 6 user với số lượng device không giới hạn của họ, nên hãy cân nhắc chính dependency này thay vì chi phí. Người thứ 7 là điểm giới hạn thay đổi, và vì Tailscale tính phí theo user thay vì 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á công bằng nghĩa là phải biết một coordination server bị breach 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 nêu 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 Tailscale control server của riêng bạn và trỏ cả hai client vào đó. Các bước cấu hình exit node sau đó vẫn giống nhau. Bạn thực hiện phê duyệt route qua command line của Headscale thay vì hosted console. Headscale thay control plane nhưng vẫn dùng các Tailscale client. Nếu muốn tự vận hành toàn bộ stack, NetBird cung cấp coordination server và client riêng để bạn host trên một VPS.
FAQ
Vì sao lưu lượng vẫn dùng kết nối cục bộ sau khi tôi chọn exit node?
Có hai nguyên nhân thường gặp. 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 route settings rồi bật Use as exit node. Phê duyệt là một tùy chọn trong console; không có command nào trên server thực hiện việc này. Nguyên nhân thứ hai khác hẳn: 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?
Tùy chọn này chỉ cần bật một lần cho mỗi machine. Nếu bạn thường xuyên rebuild VPS, thêm một block autoApprovers vào file policy của tailnet, trong đó có "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. Tagged device 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 trên chính exit node. Thiết bị sử dụng exit node sẽ gửi toàn bộ DNS query đến đó. Việc này ghi đè các nameserver global DNS và split DNS được cấu hình cho tailnet. Mạng cục bộ sẽ không thấy các tên miền bạn tra cứu. Nếu muốn tiếp tục áp dụng một nameserver của tailnet, hãy 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 độc lập với nhau, và mỗi tính năng có một tùy chọn phê duyệt riêng bên dưới Edit route settings. Cả hai đều yêu cầu bật IP forwarding trên VPS. Tránh quảng bá một range trùng với mạng home của laptop, vì route được quảng bá cụ thể hơn default route và các thiết bị cục bộ sẽ không thể truy cập được.
Exit node có ẩn lưu lượng của tôi khỏi VPS provider không?
Không. Tunnel kết thúc tại VPS, nên traffic rời server theo dạng mà đích yêu cầu, và provider của bạn truyền traffic dưới dạng plaintext ở mọi nơi mà chính site đó không mã hóa. Exit node chuyển điểm mà traffic của bạn tham gia Internet từ mạng 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 ở quán cà phê và ISP tại nhà, nhưng hoạt động đó vẫn hiển thị với VPS provider cùng user account của bạn.