Dùng VPS làm exit node cho Tailscale
Biến VPS thành Tailscale exit node qua 5 bước: cài đặt, quảng bá route, bật IP forwarding, phê duyệt trong admin console và xử lý DNS, 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 toàn bộ lưu lượng Internet của các thiết bị khác. VPS (virtual private server) phù hợp cho vai trò này vì có địa chỉ public cố định và luôn online. Để thiết lập, bạn cần 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 tùy chọn bật/tắt 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 mọi packet rồi gửi đến VPS. VPS áp dụng source NAT (network address translation) và gửi packet đi bằng địa chỉ public của chính nó. Các website sẽ thấy VPS. Wi-Fi ở quán cà phê chỉ thấy một luồng UDP được mã hóa đến VPS và không thấy gì khác.
Tailscale dùng WireGuard cho data path, cùng 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 các bước bên dưới không cần copy key ở bất kỳ đâu. Để xem đầy đủ các điểm đánh đổi, hãy đọc cách Tailscale và WireGuard thuần so sánh với nhau. Nếu bạn muốn tự quản lý mọi 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. 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 bản phân phối của bạn và cài daemon tailscaled. Sau đó, tailscale up sẽ in ra một URL xác thực. Mở URL này trong trình duyệt và đăng nhập bằng cùng account mà laptop của bạn đang dùng, vì VPS đăng nhập vào tailnet khác sẽ hoàn toàn 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 in ra đị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 dùng container virtualisation và chia sẻ 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 sẽ loại bỏ mọi packet không được gửi đến chính nó vì net.ipv4.ip_forward mặc định bằng 0. Exit node sẽ nhận traffic của bạn, giải mã rồi loại bỏ traffic đó. Ghi setting vào file để setting 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 ghi nối tiếp, vì vậy nếu chạy các dòng này lần thứ hai, cả hai setting sẽ bị ghi 2 lần. Kết quả vẫn hoạt động, nhưng cat /etc/sysctl.d/99-tailscale.conf sẽ hiển thị bất thường. Hãy xác nhận giá trị đang có hiệu lực thay vì chỉ dựa vào file:
sysctl net.ipv4.ip_forwardKết quả phải là 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 set không có output không chứng minh rằng 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 các chain này 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 dòng lệnh là toàn bộ tập hợp các cài đặt khác mặc định. Vì vậy, một lần chạy sudo tailscale up trống về 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 lời đề nghị. VPS hiện thông báo với 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 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 sẽ giữ yêu cầu và không cấp cho máy nào. tailscale exit-node list trên laptop của bạn sẽ không hiển thị gì, và traffic vẫn đi theo route thông thường. Cả hai máy đều không báo lỗi. Exit node chỉ đơn giản là không xuất hiện.
Bạn có thể tự động phê duyệt exit node bằng cách thêm một mục vào 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 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 riêng lẻ, bật tùy chọn này 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 in ra danh sách 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.
Luôn xác minh từ client, không xác minh 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 đổ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 lưu ý ngay từ đầu. Khi đã chọn exit node, client gửi mọi thứ qua tunnel, kể cả các packet đến 192.168.1.50, nên printer và network storage trong mạng của bạn sẽ không còn phản hồi. Giữ mạng 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. Việc này ghi đè lên các nameserver global DNS và split DNS đã cấu hình cho tailnet. Đây là hành vi có chủ ý. Nếu query vẫn được gửi đến resolver của mạng cục bộ, router của quán cà phê vẫn nhìn thấy tên của mọi website bạn truy cập, dù traffic được bảo vệ riêng tư. Tên miền và packet nên đi ra 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ộ: tailnet nameserver 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ỳ dữ liệu nào đến exit node. Kiểm tra bằng dig @100.100.100.100 your-vps.your-tailnet.ts.net. Trên client dùng systemd-resolved, kiểm tra bằng resolvectl status; tại đó Tailscale interface 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 cục bộ. Traffic được tunnel, còn query DNS thì không. Đây là cùng kiểu DNS leak bắt gặp ở các WireGuard tunnel tự cấu hình. Không thay đổi --accept-dns trừ khi bạn có lý do cụ thể.
IPv6 qua exit node
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 tin cậy cấu hình này:
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 thử lại 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 khi net.ipv6.conf.all.forwarding vẫn có giá trị 0 sẽ tạo đường IPv4 hoạt động và một black hole cho IPv6. 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ể tìm kiếm dễ dàng. Cả hai dòng phải được đặt trong 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. Subnet route 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.
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 cùng panel Edit route settings, bằng một toggle riêng.
Hãy chọn dải mạng cẩn thận. Route đã quảng bá cụ thể hơn default route của laptop, vì vậy nếu quảng bá 192.168.1.0/24 từ VPS, route đó sẽ chiếm quyền định tuyến các địa chỉ thuộc mạng gia đình dùng cùng dải. Khi đó, các thiết bị trên bàn của bạn sẽ mất kết nối. Hãy dùng dải do bạn tự chọn, không dùng dải mà router gia đình tự chọn.
Tăng tốc exit node bằng chuyển tiếp UDP GRO
Tailscale 1.54 trở lên, khi chạy trên kernel Linux 6.2 trở lên, có thể sử dụng cơ chế 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, trên exit node đây vẫn là bước phải thực hiện 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 phải đ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.
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 bằng cách 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 hay không. Nếu không tồn tại, 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 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 thoát
Mọi packet mà client gửi qua exit node đều rời mạng bằng public IP của VPS, nên được quy cho account của bạn. Báo cáo abuse sẽ được gửi đến hộp thư của bạn: thông báo vi phạm 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 lưu lượng của một hộ gia đình hoặc một nhóm qua cùng một server, và không mở exit node cho những người mà bạn không thể xác minh.
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 sẽ chiếm nhiều dung lượng hơn đa số người dùng dự kiến.
Các dải địa chỉ của datacenter cũng có reputation riêng. Một số site hiển thị nhiều CAPTCHA hơn với các địa chỉ này, còn một số dịch vụ streaming từ chối hoàn toàn. Không cấu hình nào của bạn thay đổi được điều đó, vì đây là đặc tính của address block mà nhà cung cấp sở hữu.
Vì sao traffic vẫn đi ra 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 gì, và log trên cả hai máy cũng không có lỗi. Mở trang Machines và bật Use as exit node.
Client chưa chọn exit node đó. Phê duyệt chỉ làm cho 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 cụ thể: tailscale ping <vps> chạy 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, rồi chạy sudo sysctl -p /etc/sysctl.d/99-tailscale.conf.
Firewall loại bỏ các packet được forward. tailscaled tạo chain ts-forward riêng, và trên một VPS mới cài thì như vậy là đủ. Một 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. Không nên đoán nguyên nhân: chạy sudo iptables -L FORWARD -n -v trong khi client thử tải một trang, rồi monitor xem 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ì đây 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ẽ chuyển sang relay DERP, làm tăng độ trễ 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 máy chủ điều phối của Tailscale
Toàn bộ nội dung trên vẫn phụ thuộc vào máy chủ điều phối do Tailscale vận hành để trao đổi key và xử lý phê duyệt mà bạn đã chọn. Lưu lượng vẫn đi thẳng từ laptop đến VPS, và máy chủ điều phối không truyền lưu lượng đó. Tuy nhiên, máy chủ 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ì. Nếu muốn loại bỏ phụ thuộc này, hãy chạy Headscale làm máy chủ control của Tailscale và trỏ cả hai client đến đó. Sau đó, các bước cấu hình exit node không thay đổi. Bạn sẽ phê duyệt route bằng CLI của Headscale thay vì console do Tailscale vận hành.
FAQ
Vì sao lưu lượng của tôi vẫn đi qua kết nối local 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 route settings rồi bật Use as exit node. Việc phê duyệt là một toggle trong console; không có command nào trên server thực hiện việc này. Nguyên nhân thứ 2 khác hẳn: IP forwarding đang tắt, nên tunnel khởi động, tailscale ping đến VPS vẫn 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?
Toggle này chỉ cần bật 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, trong đó có "exitNode": ["tag:exit"], định nghĩa tag:exit bên dưới tagOwners rồi khởi động node 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?
Chính exit node. Thiết bị sử dụng exit node sẽ gửi mọi DNS query đến đó. Việc này ghi đè các nameserver global và split DNS được đặt cho tailnet. Mạng local sẽ không còn thấy những 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 phân giải vì Tailscale client trả lời chúng local tại 100.100.100.100.
Một VPS có thể đồng thời làm 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, mỗi loại có một toggle phê duyệt riêng bên dưới Edit route settings. Cả 2 đề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 gia đình của laptop, vì route được quảng bá cụ thể hơn default route và các thiết bị local của bạn sẽ không thể truy cập.
Exit node có ẩn traffic 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 traffic rời server dưới dạng mà destination yêu cầu. Nhà cung cấp vẫn truyền traffic ở dạng cleartext tại những nơi chính site không mã hóa. Exit node chuyển điểm traffic 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 gia đình, nhưng hoạt động đó vẫn hiển thị với nhà cung cấp VPS cùng user account của bạn.