Cara Menjalankan Penghala Subnet Tailscale pada VPS
Iklankan rangkaian peribadi ke tailnet dari VPS, dengan kelulusan laluan, pemajuan IP yang kekal selepas but semula dan flag --accept-routes untuk Linux.
Apa yang dilakukan oleh penghala subnet Tailscale
Penghala subnet Tailscale ialah satu mesin yang mengiklankan keseluruhan julat alamat IP peribadi kepada tailnet anda, supaya setiap peranti dalam tailnet boleh mencapai alamat dalam julat tersebut walaupun tiada apa-apa di sana menjalankan Tailscale. Tailnet ialah rangkaian Tailscale peribadi anda, iaitu himpunan peranti yang dilog masuk ke satu akaun atau organisasi. Nod keluar ialah ciri yang sering dikelirukan dengannya, tetapi tugasnya berlawanan. Nod keluar menghantar semua trafik peranti melalui VPS, sehingga VPS menjadi laluan peranti tersebut ke Internet awam.
Ringkasnya, penghala subnet menjadikan satu rangkaian peribadi boleh dicapai dari tailnet. Nod keluar mengubah lokasi trafik awam anda keluar ke Internet. Jika pilihan kedua ialah yang anda perlukan, baca cara menjalankan nod keluar Tailscale pada VPS. Kedua-duanya menggunakan flag yang berasingan, dan satu VPS boleh menjalankan kedua-duanya serentak, tetapi kedua-duanya menyelesaikan masalah yang berbeza dan gagal atas sebab yang berbeza.
Apabila VPS memerlukan penghala subnet
Kes yang biasa ialah rangkaian peribadi yang telah diberikan oleh penyedia anda. VPS anda mempunyai alamat awam dan antara muka kedua pada segmen peribadi, manakala pelayan lain pada segmen itu langsung tiada alamat awam: pangkalan data pada 10.0.0.20 dan sasaran sandaran pada 10.0.0.30. Pasang Tailscale pada satu VPS, iklankan 10.0.0.0/24, dan komputer riba anda boleh mencapai alamat peribadi itu secara terus. Tiada perubahan diperlukan pada pelayan lain dalam segmen tersebut, dan pangkalan data itu masih tiada alamat awam. Jika satu-satunya keperluan anda daripada segmen itu ialah satu aplikasi web pada satu port, mengiklankan seluruh julat adalah berlebihan, dan Tailscale serve memasang HTTPS pada port tunggal itu. Logik yang sama terpakai pada daemon yang sengaja hanya bind kepada localhost, seperti dsh yang berjalan tanpa kepala di bawah systemd, apabila alamat tailnet pada VPS itu menggantikan terowong SSH yang perlu anda biarkan terbuka untuk mencapai UI-nya.
Kes yang satu lagi ialah rangkaian di seberang VPS. Ini boleh berupa LAN (local area network) rumah atau pejabat di belakang penghalanya sendiri, atau rak peranti yang langsung tidak boleh menjalankan Tailscale, seperti suis terurus atau NAS lama dengan firmware terkunci. Satu kotak Linux pada rangkaian itu menjadi penghala subnet untuk semua peranti lain di dalamnya. Di rumah, kotak itu selalunya VM kecil pada hypervisor yang sememangnya anda jalankan, dan perbandingan kos hos Proxmox di rumah dengan VPS yang disewa perlu diselesaikan sebelum anda menentukan di hujung terowong mana servis anda patut ditempatkan.
Kedua-dua kes ini mempunyai satu keperluan yang sama. Penghala subnet mestilah sudah boleh mencapai julat yang diiklankannya menggunakan jadual penghalaan dan firewallnya sendiri. Tailscale tidak membina sambungan itu. Tailscale membawa trafik ke penghala tersebut dan menyerahkannya kepada kernel untuk dimajukan.
Pasang Tailscale dan semak laluan setempat terlebih dahulu
curl -fsSL https://tailscale.com/install.sh | shSkrip ini mengesan pengedaran, menambah repositori pakej Tailscale, memasang perintah tailscale dan daemon tailscaled, kemudian mengaktifkan servis tersebut. Sahkan dengan systemctl is-active tailscaled, yang sepatutnya memaparkan active.
Sebelum melakukan perkara lain, pastikan VPS boleh mencapai rangkaian yang ingin anda iklankan.
ip route show
ping -c3 10.0.0.20ip route show mesti menyenaraikan julat peribadi pada antara muka sebenar, seperti 10.0.0.0/24 dev enp7s0 proto kernel scope link src 10.0.0.5. Jika ping gagal pada peringkat ini, iaitu pada penghala itu sendiri, tiada flag Tailscale yang dapat membetulkannya. Masalahnya terletak pada konfigurasi rangkaian VPS atau firewall pada hos sasaran. Betulkan masalah itu terlebih dahulu kerana setiap ujian seterusnya bergantung padanya.
Hidupkan pemajuan IP dan pastikan tetapan kekal selepas but semula
Mesin Linux menggugurkan mana-mana paket yang bukan ditujukan kepadanya sendiri kecuali pemajuan dihidupkan. Memajukan paket mesin lain ialah tugas utama penghala subnet, jadi langkah ini tidak boleh diabaikan.
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.confSemak dengan sysctl net.ipv4.ip_forward, yang sepatutnya memaparkan net.ipv4.ip_forward = 1.
Ramai orang melaksanakan langkah ini separuh sahaja. sudo sysctl -w net.ipv4.ip_forward=1 berfungsi serta-merta tetapi hilang pada but seterusnya. Akibatnya, penghala subnet berjalan selama beberapa minggu lalu berhenti pada pagi selepas but semula untuk naik taraf kernel. Bahagian yang mengelirukan ialah tiada apa-apa yang kelihatan rosak. tailscale status masih menunjukkan nod dalam talian, konsol pentadbiran masih menunjukkan laluan diluluskan, dan klien masih mempunyai laluan tersebut. Paket tiba di VPS, kemudian kernel menggugurkannya tanpa mencatat apa-apa log. Menulis nilai tersebut ke dalam /etc/sysctl.d/99-tailscale.conf akan mengembalikannya selepas but semula.
Jika anda mengiklankan laluan ketika pemajuan masih dimatikan, tailscale up memberikan amaran pada masa itu, dengan baris yang hampir sama seperti Warning: IPv4 forwarding is disabled. Subnet routes and exit nodes may not work correctly.. Baca output arahan tersebut dan jangan terus melangkauinya.
Iklankan route
sudo tailscale up --advertise-routes=10.0.0.0/24Pada VPS yang telah dilog masuk ke tailnet, ubah tetapan secara terus:
sudo tailscale set --advertise-routes=10.0.0.0/24Gunakan tailscale set untuk setiap perubahan seterusnya. Menjalankan semula tailscale up dengan satu flag sahaja akan menetapkan semula flag yang tidak diulangi, dan CLI akan menghentikan arahan dengan ralat yang menyatakan bahawa perubahan tetapan dengan cara ini memerlukan semua flag bukan lalai disebut. tailscale set mengubah satu tetapan sahaja dan mengekalkan tetapan lain.
Beberapa julat perlu dimasukkan dalam satu senarai yang dipisahkan koma tanpa ruang: --advertise-routes=10.0.0.0/24,192.168.50.0/24. Setiap entri mestilah alamat rangkaian dalam notasi CIDR (classless inter-domain routing, bentuk 10.0.0.0/24). Jika alamat hos sendiri tersilap ditulis, 10.0.0.5/24, arahan akan ditolak kerana bit selepas prefix bukan sifar, dan ralat tersebut akan menyatakan prefix yang mungkin dimaksudkan. Untuk menghentikan pengiklanan, tetapkan senarai kosong dengan sudo tailscale set --advertise-routes=.
Luluskan laluan dalam konsol pentadbir
Mengiklankan laluan ialah permintaan, bukan perubahan. Sehingga pentadbir meluluskannya, tiada klien menerima laluan itu dan tiada apa-apa dalam julat tersebut boleh dicapai. Ini disengajakan kerana mesin yang boleh menambah dirinya ke jadual penghalaan semua orang boleh menangkap trafik untuk mana-mana julat yang dikehendakinya.
Luluskannya pada halaman Machines dalam konsol pentadbir. VPS itu disenaraikan dengan lencana subnet. Buka barisnya, cari bahagian subnets, edit tetapan laluan, tandakan laluan tersebut dan simpan.
Kelulusan dibuat mengikut awalan. Iklankan 10.0.0.0/24 hari ini dan 192.168.50.0/24 bulan depan. Awalan baharu itu akan tiba dalam keadaan belum diluluskan, manakala awalan lama terus berfungsi. Laluan yang diluluskan dan laluan yang diabaikan kelihatan sama dari VPS. Oleh itu, semak konsol sebelum menyahpepijat perkara lain.
Anda boleh melangkau langkah manual dengan blok autoApprovers dalam fail dasar tailnet:
{
"autoApprovers": {
"routes": {
"10.0.0.0/24": ["tag:subnet-router"]
}
}
}Kemudian hidupkan nod dengan tag itu, sudo tailscale up --advertise-routes=10.0.0.0/24 --advertise-tags=tag:subnet-router. Laluan tersebut akan diluluskan sebaik sahaja diiklankan. Tag itu mesti wujud terlebih dahulu dalam bahagian tagOwners pada fail dasar yang sama. Tetapan ini berguna jika anda membina semula VPS daripada skrip kerana nod yang dibina semula ialah nod baharu dan laluannya akan kembali kepada keadaan belum diluluskan.
Mengapa klien Linux mengabaikan route tanpa --accept-routes
Route itu kini telah diiklankan dan diluluskan. Telefon dan Mac anda boleh mencapai 10.0.0.20. Komputer riba Linux anda tidak boleh mencapainya, dan tiada petunjuk masalah dalam konsol pentadbir.
Menerima route subnet bermaksud menulis entri ke dalam jadual routing klien. Pada Android, iOS, macOS, tvOS dan Windows, klien Tailscale melakukannya untuk anda. Pada Linux, proses itu tidak dilakukan kerana mesin Linux selalunya ialah pelayan atau router yang jadual routingnya telah dikonfigurasikan dengan sengaja. Penyisipan senyap-senyap bagi /24 yang dipelajari daripada rangkaian boleh mengganggu trafik yang sedang dikendalikan oleh mesin tersebut. Oleh itu, pada Linux, anda perlu mengaktifkannya secara jelas pada setiap klien:
sudo tailscale set --accept-routesKemudian semak lokasi route tersebut:
ip route show table 52
ip route get 10.0.0.20Tailscale pada Linux tidak meletakkan route yang diterima dalam jadual routing utama. Tailscale meletakkannya dalam jadual routing 52 dan memasang peraturan dasar yang boleh dilihat dengan ip rule show dalam julat keutamaan 5210 hingga 5270. Peraturan ini menghantar paket yang sepadan dengan mana-mana entri ke jadual tersebut. Oleh itu, ip route show sahaja tidak akan menyenaraikan 10.0.0.0/24, dan pembaca yang hanya menyemak arahan itu akan menyimpulkan bahawa --accept-routes tidak melakukan apa-apa. ip route show table 52 ialah arahan yang menunjukkan keadaan sebenar, dan outputnya sepatutnya menyenaraikan julat yang diiklankan pada tailscale0.
Terdapat satu pengecualian yang perlu diketahui. Jika nod Linux ini sendiri ialah subnet router kedua untuk rangkaian tempatannya, --accept-routes akan menyebabkan trafik untuk subnet yang bersambung terus dengannya dihantar melalui router yang satu lagi, bukannya melalui antara muka nod itu sendiri. Pada router sandaran dalam pasangan ketersediaan tinggi, biarkan --accept-routes tidak diaktifkan dan hanya iklankan route.
Mod kegagalan: dua router mengiklankan julat yang bertindih
Dua router subnet tidak boleh mengiklankan julat yang sama. Julat yang bertindih dengan panjang awalan berbeza dibenarkan, dan Tailscale memilih padanan yang paling khusus. Jika router A mengiklankan 10.0.0.0/24 dan router B mengiklankan 10.0.0.0/16, trafik ke 10.0.0.20 dihantar melalui A.
Perkara yang mengejutkan ialah tingkah laku apabila A menjadi luar talian. Tailscale tidak beralih kepada laluan yang kurang khusus. Trafik ke 10.0.0.20 terhenti, manakala trafik ke 10.1.0.20 terus berfungsi melalui B. Gejala ini kelihatan seperti separuh rangkaian peribadi tidak berfungsi, sedangkan puncanya ialah satu nod luar talian yang memegang awalan lebih khusus. Jika anda mahu failover, pastikan router yang mengiklankan julat lebih luas turut mengiklankan awalan yang lebih sempit, supaya kedua-duanya meliputi alamat yang sama.
Pertindihan yang satu lagi berlaku lebih dekat dengan klien. Jika anda berada pada rangkaian hotel di 192.168.1.0/24 sementara router subnet anda mengiklankan 192.168.1.0/24, kedua-duanya bersaing untuk destinasi yang sama, dan laluan yang menang bergantung pada platform. Pada Linux, pasang peraturan sebelum peraturan milik Tailscale supaya alamat tempatan menggunakan jadual utama:
sudo ip rule add to 192.168.1.0/24 priority 2500 lookup mainPeraturan itu tidak kekal dan akan hilang selepas boot seterusnya. Penyelesaian sebenar ialah memilih julat peribadi yang tidak akan anda temui pada rangkaian lain. 192.168.0.0/24 dan 192.168.1.0/24 ialah lalai pada kebanyakan router rumah, jadi pilih sesuatu dalam 10.0.0.0/8 yang anda tetapkan dengan sengaja. Perlanggaran yang sama menjejaskan VPN WireGuard biasa yang anda konfigurasikan secara manual, atas sebab yang sama: laluan tempatan yang lebih khusus akan menang, jadi trafik tidak pernah memasuki tunnel.
Mod kegagalan: DNS diselesaikan kepada alamat yang tidak diliputi oleh mana-mana laluan
Kes ini sukar dinyahpepijat kerana tiada komponen melaporkan ralat. Nama berjaya diselesaikan. Sambungan tamat masa.
Katakan db.internal.example.com diselesaikan kepada 10.0.5.20 melalui nameserver peribadi anda, dan anda mengiklankan 10.0.0.0/24. Carian berjaya kerana resolusi DNS (domain name system) dan penghalaan IP ialah dua langkah berasingan, dan kedua-duanya tidak menyemak langkah yang satu lagi. Kemudian paket ke 10.0.5.20 tidak menemui laluan sepadan pada tailnet, lalu keluar melalui get lalai klien dan hilang.
Dua arahan ini memisahkan kedua-dua bahagian tersebut:
nslookup db.internal.example.com
ip route get 10.0.5.20Jika carian mengembalikan alamat tetapi ip route get tidak memberikan respons dengan dev tailscale0, nama itu betul dan laluan tiada. Iklankan julat yang meliputi alamat tersebut, sama ada 10.0.0.0/16 atau awalan eksplisit kedua, kemudian luluskan awalan baharu itu dalam konsol.
Terdapat perangkap yang sepadan pada nameserver itu sendiri. Jika anda menetapkan nameserver global dalam konsol pentadbiran pada alamat peribadi seperti 10.0.0.53, alamat itu mesti berada dalam laluan yang diluluskan, atau peranti anda tidak dapat mencapai resolver tersebut langsung. Jika anda menghidupkan pilihan yang mengatasi pelayan DNS tempatan sambil menunjuk kepada resolver yang tidak dapat dicapai, setiap peranti dalam tailnet kehilangan resolusi nama serentak, termasuk peranti yang berfungsi sesaat sebelumnya. Iklankan dan luluskan laluan ke resolver terlebih dahulu, kemudian ubah tetapan DNS. Jika DNS dalam tunnel ialah bahagian yang terus menimbulkan masalah, cara DNS gagal melalui tunnel WireGuard menerangkan mekanisme yang sama tanpa lapisan penyelarasan di atasnya.
NAT Sumber dan pautan antara tapak
Secara lalai, penghala subnet menulis semula alamat sumber setiap paket yang dihantar semula kepada alamat peribadinya sendiri. Ini ialah SNAT (source network address translation), dan ia digunakan supaya respons berfungsi tanpa mengubah apa-apa pada rangkaian peribadi: pangkalan data di 10.0.0.20 menjawab VPS, yang memang sudah diketahui cara untuk dicapainya. Kesannya, pangkalan data melihat setiap sambungan tailnet seolah-olah datang dari VPS. Oleh itu, peraturan firewall mengikut sumber dan log akses tidak memberikan maklumat yang berguna.
Matikan SNAT pada Linux apabila anda mahu alamat tailnet sebenar klien dikekalkan:
sudo tailscale set --snat-subnet-routes=falseHos pada rangkaian peribadi itu kemudiannya memerlukan laluan kembali ke 100.64.0.0/10, iaitu julat yang diberikan oleh Tailscale kepada peranti, dengan menunjuk kepada penghala subnet. Tanpa laluan kembali itu, responsnya dihantar ke get lalai dan tidak pernah sampai. Akibatnya, sambungan tergantung selepas paket pertama. Tambahkan laluan statik pada get rangkaian peribadi, atau kekalkan SNAT diaktifkan.
Pautan antara tapak menggunakan dua penghala subnet yang melakukan perkara ini serentak. Setiap penghala mengiklankan rangkaiannya sendiri dan menerima rangkaian penghala yang satu lagi:
sudo tailscale up --advertise-routes=10.0.0.0/24 --snat-subnet-routes=false --accept-routesJalankan perintah yang sepadan pada penghala yang satu lagi menggunakan julatnya sendiri. Kedua-dua julat mestilah berbeza. Jika pemindahan besar tergendala sedangkan ssh dan ping berfungsi dengan baik, puncanya ialah MSS (maximum segment size), iaitu saiz bongkah data terbesar yang dibawa oleh paket TCP. Overhed terowong menyebabkan paket yang dihantar semula menjadi terlalu besar untuk sesetengah pautan di tengah laluan. Clamping membetulkan keadaan ini:
sudo iptables -t mangle -A FORWARD -o tailscale0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtuSimpan peraturan itu dengan iptables-persistent. Jika tidak, peraturan tersebut akan hilang pada boot seterusnya.
Penyelenggaraan supaya ia terus berjalan
Kunci nod tamat tempoh selepas 180 hari secara lalai, mulai Ogos 2026. Apabila kunci pada penghala subnet tamat tempoh, nod akan dilog keluar dan seluruh julat yang diiklankan menjadi tidak boleh dicapai, tanpa sebarang perubahan konfigurasi yang menerangkannya. Nyahdayakan tamat tempoh kunci untuk mesin ini pada halaman Machines dalam konsol pentadbir, kemudian catatkan bahawa anda telah melakukannya.
Tailscale mengutamakan sambungan terus antara peer dan menggunakan pelayan relay apabila sambungan terus tidak dapat diwujudkan. Relay berfungsi, tetapi menambahkan kependaman. VPS dengan alamat awam ialah kes yang mudah: benarkan UDP masuk pada port 41641 dan kebanyakan peer akan bersambung secara terus. Jika ufw mengurus firewall, peraturan ufw yang sebenarnya diperlukan oleh VPS menerangkan sintaksnya.
Peraturan akses ialah bahagian yang satu lagi. Dalam tailnet lalai, setiap peranti anda boleh mencapai semua peranti lain, jadi laluan yang diluluskan akan berfungsi tanpa konfigurasi tambahan. Selepas anda menulis dasar ACL, bahagian destinasi sesuatu peraturan perlu menamakan julat peribadi, kerana 10.0.0.20 bukan alamat tailnet dan tidak diliputi oleh peraturan yang ditulis berdasarkan IP tailnet atau tag.
Akhir sekali, tentukan sama ada anda mahu menggunakan pelayan penyelarasan yang tidak anda kendalikan. Control plane Tailscale ialah servis terhos. Kunci anda kekal pada mesin anda, tetapi akaun dan fail dasar disimpan di sana. Perkara yang sebenarnya boleh dilakukan oleh seseorang dengan control plane yang telah diceroboh atau log masuk identiti yang dicuri ialah perkara yang perlu dinilai sebelum anda memberikannya laluan ke rangkaian peribadi anda, dan model kepercayaan Tailscale menerangkan sempadan tersebut. Kos jarang menjadi sebab orang meninggalkannya, kerana pelan percuma meliputi sehingga enam pengguna dengan peranti sendiri tanpa had, walaupun penghala subnet yang anda jalankan di bawah tag dikira secara berbeza daripada penghala yang dilog masuk menggunakan akaun anda. Selepas had itu, bil dikira berdasarkan orang, bukan mesin, jadi jumlah sebenar yang dibayar oleh isi rumah atau pasukan lima orang selepas pelan percuma tamat wajar dikira sebelum anda menambah akaun yang menyebabkan anda melepasi had tersebut. Menjalankan Headscale, pelayan kawalan Tailscale yang dihoskan sendiri mengekalkan komponen itu pada VPS anda sendiri, tetapi anda perlu menyelenggarakannya. Pilihan lain untuk kebimbangan yang sama ialah meninggalkan klien Tailscale juga, dan mengehos sendiri pelayan VPN NetBird meletakkan lapisan penyelarasan serta klien meshnya pada satu mesin yang anda kendalikan. Jika anda masih membuat keputusan antara model ini dengan konfigurasi yang ditulis secara manual, perbandingan WireGuard dan Tailscale menerangkan perkara yang disediakan oleh lapisan penyelarasan serta kosnya.
FAQ
Apakah perbezaan antara subnet router dengan exit node?
Subnet router mengiklankan julat alamat peribadi supaya peranti tailnet boleh mencapai mesin yang tidak menjalankan Tailscale. Exit node mengiklankan dirinya sebagai laluan ke seluruh Internet, supaya peranti menghantar semua trafiknya melalui alamat awam nod tersebut. Satu VPS boleh berfungsi sebagai kedua-duanya. Kedua-duanya menggunakan flag berasingan, --advertise-routes dan --advertise-exit-node, dan setiap satu memerlukan kelulusan sendiri dalam konsol pentadbir.
Mengapakah klien Linux saya mengabaikan laluan subnet yang diiklankan?
Klien Linux tidak menerima laluan subnet melainkan anda mengarahkannya untuk berbuat demikian. Jalankan sudo tailscale set --accept-routes pada klien. Kemudian semak dengan ip route show table 52, bukan ip route show. Tailscale memasang laluan yang diterima dalam jadual routing 52 dan mencapainya melalui peraturan dasar, jadi jadual utama tidak pernah menyenaraikan laluan tersebut dan laluan yang berfungsi kelihatan seperti tiada.
Subnet saya berhenti berfungsi selepas reboot. Apakah yang rosak?
Kemungkinan besar, IP forwarding. Nilai yang ditetapkan dengan sysctl -w tidak kekal selepas reboot, jadi tuliskannya ke /etc/sysctl.d/99-tailscale.conf dan sahkan dengan sysctl net.ipv4.ip_forward. Jika forwarding aktif tetapi julat itu masih tidak boleh dicapai, semak nod tersebut dalam konsol pentadbir. Kunci nod luput selepas 180 hari secara lalai, dan subnet router yang kuncinya luput kelihatan seperti masalah rangkaian, bukannya masalah akaun.
Bolehkah dua subnet router mengiklankan julat yang sama?
Tidak jika julatnya sepadan tepat. Julat yang bertindih dengan panjang prefix yang berbeza tidak menjadi masalah, dan laluan yang paling khusus akan digunakan. Failover memerlukan perhatian: apabila router yang memegang prefix lebih khusus menjadi offline, Tailscale tidak beralih kepada laluan yang lebih luas, jadi trafik tersebut terhenti. Untuk pasangan standby sebenar, konfigurasikan kedua-dua router supaya mengiklankan prefix khusus yang sama.
Nama hos berjaya diselesaikan tetapi sambungan tamat masa. Mengapa?
Penyelesaian DNS dan routing ialah dua langkah berasingan. Nama boleh diselesaikan kepada alamat yang tidak diliputi oleh mana-mana laluan yang diluluskan, lalu paket keluar melalui gateway lalai klien. Jalankan ip route get <address> pada klien. Jika jawapannya tidak mengandungi dev tailscale0, iklankan julat yang meliputi alamat tersebut dan luluskan prefix baharu dalam konsol pentadbir.