SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Cara Setup Tailscale Subnet Router pada VPS Linux

Ketahui langkah konfigurasi subnet router Tailscale di VPS untuk akses rangkaian peribadi. Panduan ini merangkumi tetapan IP forwarding, kelulusan laluan, dan flag --accept-routes.

Fungsi subnet router Tailscale

Subnet router Tailscale ialah satu mesin yang mengiklankan julat alamat IP peribadi kepada tailnet anda, supaya setiap peranti dalam tailnet boleh mencapai alamat dalam julat tersebut walaupun peranti di sana tidak menjalankan Tailscale. Tailnet anda ialah rangkaian Tailscale peribadi anda: set peranti yang dilog masuk ke satu akaun atau organisasi. Exit node ialah ciri yang sering dikelirukan dengannya, dan ia melakukan tugas yang bertentangan. Ia menghantar semua trafik peranti keluar melalui VPS, supaya VPS menjadi laluan peranti tersebut ke internet awam.

Satu ayat bagi setiap satu. Subnet router menjadikan satu rangkaian peribadi boleh dicapai daripada tailnet. Exit node mengubah lokasi trafik awam anda keluar. Jika yang kedua ialah perkara yang anda mahukan, baca cara menjalankan exit node Tailscale pada VPS sebaliknya. Ia merupakan flag yang berasingan, dan satu VPS boleh melakukan kedua-duanya serentak, tetapi ia menyelesaikan masalah yang berbeza dan gagal dengan cara yang berbeza.

Apabila VPS memerlukan subnet router

Kes yang biasa berlaku ialah rangkaian peribadi yang telah disediakan oleh penyedia anda. VPS anda mempunyai alamat awam dan antara muka kedua pada segmen peribadi, manakala pelayan lain pada segmen tersebut tidak mempunyai alamat awam langsung: pangkalan data di 10.0.0.20, sasaran sandaran di 10.0.0.30. Pasang Tailscale pada satu VPS, iklankan 10.0.0.0/24, dan komputer riba anda boleh mencapai alamat peribadi tersebut secara terus. Tiada apa-apa lagi pada segmen tersebut yang berubah, dan pangkalan data masih tidak mempunyai alamat awam.

Kes yang satu lagi ialah rangkaian di bahagian jauh VPS. LAN (rangkaian kawasan setempat) rumah atau pejabat di belakang penghala (router) sendiri, atau rak peralatan yang tidak boleh menjalankan Tailscale langsung, seperti suis terurus atau NAS lama dengan perisian tegar terkunci. Satu kotak Linux pada rangkaian tersebut menjadi subnet router untuk semua peranti lain di atasnya.

Kedua-dua kes berkongsi satu keperluan. Subnet router mestilah sudah boleh mencapai julat yang diiklankannya, menggunakan jadual penghalaan dan firewallnya sendiri. Tailscale tidak membina sambungan tersebut. Ia membawa trafik ke penghala dan menyerahkannya kepada kernel untuk diteruskan.

Pasang Tailscale dan semak laluan tempatan terlebih dahulu

curl -fsSL https://tailscale.com/install.sh | sh

Skrip ini mengesan pengedaran sistem, menambah repositori pakej Tailscale, memasang arahan tailscale serta daemon tailscaled, kemudian mendayakan servis tersebut. Sahkan pemasangan dengan systemctl is-active tailscaled, yang sepatutnya memaparkan active.

Sebelum melakukan apa-apa, pastikan VPS boleh mencapai rangkaian yang anda rancang untuk diiklankan.

ip route show
ping -c3 10.0.0.20

ip route show mesti menyenaraikan julat peribadi pada antara muka sebenar, contohnya seperti 10.0.0.0/24 dev enp7s0 proto kernel scope link src 10.0.0.5. Jika ping gagal di sini, pada penghala itu sendiri, tiada flag Tailscale yang akan membaikinya. Masalahnya terletak pada konfigurasi rangkaian VPS atau firewall pada hos sasaran. Selesaikan perkara itu dahulu, kerana setiap ujian seterusnya bergantung kepadanya.

Hidupkan IP forwarding dan pastikan ia kekal selepas but semula

Mesin Linux akan menggugurkan sebarang paket yang tidak ditujukan kepadanya melainkan fungsi forwarding dihidupkan. Menghantar paket mesin lain adalah tugas utama penghala subnet, jadi langkah ini wajib dilakukan.

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

Semak statusnya dengan sysctl net.ipv4.ip_forward, yang sepatutnya memaparkan net.ipv4.ip_forward = 1.

Ramai pengguna sering melakukan langkah ini secara tidak lengkap. sudo sysctl -w net.ipv4.ip_forward=1 berfungsi serta-merta tetapi akan hilang pada but seterusnya, menyebabkan penghala subnet berjalan selama berminggu-minggu dan kemudian terhenti pada pagi selepas but semula akibat naik taraf kernel. Bahagian yang mengelirukan ialah tiada apa-apa yang kelihatan rosak. tailscale status masih menunjukkan nod dalam talian, konsol pentadbir masih menunjukkan laluan diluluskan, dan klien masih mempunyai laluan yang dipasang. Paket sampai ke VPS dan kernel menggugurkannya tanpa merekodkan apa-apa. Menulis nilai tersebut ke dalam /etc/sysctl.d/99-tailscale.conf adalah cara untuk mengekalkannya selepas but semula.

Jika anda mengiklankan laluan semasa forwarding masih dimatikan, tailscale up akan memberi amaran kepada anda pada masa itu, dengan baris yang hampir sama dengan Warning: IPv4 forwarding is disabled. Subnet routes and exit nodes may not work correctly.. Baca output arahan tersebut dan jangan sekadar menatal melewatinya.

Mengiklankan laluan

sudo tailscale up --advertise-routes=10.0.0.0/24

Pada VPS yang sudah log masuk ke tailnet anda, tukar tetapan tersebut secara terus:

sudo tailscale set --advertise-routes=10.0.0.0/24

Gunakan tailscale set untuk setiap perubahan seterusnya. Menjalankan semula tailscale up dengan satu flag sahaja akan menetapkan semula flag yang tidak anda ulangi, dan CLI akan menghalang anda dengan ralat yang menyatakan bahawa menukar tetapan dengan cara ini memerlukan penyertaan semua flag bukan lalai. tailscale set menukar satu tetapan dan membiarkan yang lain tidak berubah.

Beberapa julat boleh dimasukkan dalam satu senarai yang dipisahkan dengan 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). Menulis alamat hos anda sendiri secara tidak sengaja, 10.0.0.5/24, akan ditolak kerana bit selepas awalan bukan sifar, dan ralat tersebut akan menamakan awalan yang mungkin anda maksudkan. Untuk berhenti mengiklankan, tetapkan senarai kosong dengan sudo tailscale set --advertise-routes=.

Luluskan laluan dalam konsol pentadbir

Mengiklankan laluan hanyalah satu permintaan, bukan perubahan. Selagi pentadbir tidak meluluskannya, tiada klien akan menerima laluan tersebut dan tiada apa-apa dalam julat itu boleh dicapai. Ini dilakukan dengan sengaja, kerana mesin yang boleh menambah dirinya ke dalam jadual penghalaan semua orang boleh memintas trafik bagi mana-mana julat yang ia mahukan.

Luluskan laluan tersebut pada halaman Machines dalam konsol pentadbir. VPS tersebut akan disenaraikan dengan lencana subnet. Buka barisnya, cari bahagian subnets, edit tetapan laluan, tandakan laluan tersebut, dan simpan.

Kelulusan adalah berdasarkan setiap awalan (prefix). Jika anda mengiklankan 10.0.0.0/24 hari ini dan 192.168.50.0/24 bulan depan, awalan baharu akan tiba dalam keadaan tidak diluluskan manakala awalan lama terus berfungsi. Laluan yang diluluskan dan laluan yang diabaikan kelihatan sama dari sisi VPS, jadi semak konsol sebelum anda melakukan penyahpepijatan (debug) perkara lain.

Anda boleh melangkau langkah manual ini dengan blok autoApprovers dalam fail polisi tailnet:

{
  "autoApprovers": {
    "routes": {
      "10.0.0.0/24": ["tag:subnet-router"]
    }
  }
}

Kemudian, hidupkan nod dengan tag tersebut, sudo tailscale up --advertise-routes=10.0.0.0/24 --advertise-tags=tag:subnet-router, dan laluan akan diluluskan sebaik sahaja ia diiklankan. Tag tersebut mestilah wujud dalam bahagian tagOwners dalam fail polisi yang sama terlebih dahulu. Langkah ini wajar disediakan jika anda membina semula VPS daripada skrip, kerana nod yang dibina semula dianggap sebagai nod baharu dan laluannya akan bermula dalam keadaan tidak diluluskan semula.

Mengapa klien Linux mengabaikan laluan tanpa --accept-routes

Laluan kini diiklankan dan diluluskan. Telefon dan Mac anda boleh mencapai 10.0.0.20. Komputer riba Linux anda tidak boleh, dan tiada apa-apa dalam konsol pentadbir menunjukkan masalah.

Menerima laluan subnet bermakna menulis entri ke dalam jadual penghalaan klien. Pada Android, iOS, macOS, tvOS dan Windows, klien Tailscale melakukan perkara itu untuk anda. Pada Linux, ia tidak melakukannya kerana mesin Linux sering menjadi pelayan atau penghala yang jadual penghalaannya dikonfigurasikan secara sengaja oleh seseorang, dan memasukkan /24 yang dipelajari daripada rangkaian secara senyap boleh mengganggu trafik yang sudah dikendalikan oleh mesin tersebut. Jadi pada Linux, anda perlu memilih untuk menyertainya, pada setiap klien:

sudo tailscale set --accept-routes

Kemudian semak di mana laluan tersebut diletakkan:

ip route show table 52
ip route get 10.0.0.20

Tailscale pada Linux tidak meletakkan laluan yang diterima dalam jadual penghalaan utama. Ia meletakkannya dalam jadual penghalaan 52 dan memasang peraturan polisi, yang boleh dilihat dengan ip rule show dalam julat keutamaan 5210 hingga 5270, yang menghantar paket yang tidak sepadan ke jadual tersebut. Jadi ip route show dengan sendirinya tidak akan menyenaraikan 10.0.0.0/24, dan pembaca yang hanya menyemak arahan itu akan membuat kesimpulan bahawa --accept-routes tidak melakukan apa-apa. ip route show table 52 ialah arahan yang menunjukkan perkara sebenar, dan ia sepatutnya menyenaraikan julat yang diiklankan pada tailscale0.

Satu pengecualian perlu diketahui. Jika nod Linux ini sendiri merupakan penghala subnet kedua untuk rangkaian tempatannya sendiri, --accept-routes menyebabkannya menghantar trafik untuk subnet yang disambungkan secara terus melalui penghala lain dan bukannya keluar melalui antara mukanya sendiri. Pada penghala sedia (standby) dalam pasangan ketersediaan tinggi (high availability), biarkan --accept-routes dimatikan dan hanya lakukan pengiklanan sahaja.

Mod kegagalan: dua penghala mengiklankan julat yang bertindih

Dua penghala subnet tidak boleh mengiklankan julat yang sama. Julat bertindih dengan panjang awalan yang berbeza adalah dibenarkan, dan Tailscale akan memilih padanan yang paling spesifik. Dengan penghala A mengiklankan 10.0.0.0/24 dan penghala B mengiklankan 10.0.0.0/16, trafik ke 10.0.0.20 akan dihantar ke A.

Perkara yang mengejutkan pengguna ialah kelakuan sistem apabila A terputus talian. Tailscale tidak akan beralih kepada laluan yang kurang spesifik. Trafik ke 10.0.0.20 akan terhenti, manakala trafik ke 10.1.0.20 terus berfungsi melalui B. Gejala ini kelihatan seperti separuh daripada rangkaian peribadi tidak berfungsi, dan puncanya ialah satu nod luar talian yang memegang awalan yang lebih spesifik. Jika anda mahukan failover, pastikan penghala yang lebih luas turut mengiklankan awalan yang lebih sempit, supaya kedua-duanya meliputi alamat yang sama.

Pertindihan yang satu lagi berlaku lebih dekat dengan klien. Berada di rangkaian hotel pada 192.168.1.0/24 sementara penghala subnet anda mengiklankan 192.168.1.0/24 bermakna kedua-duanya bersaing untuk destinasi yang sama, dan pihak yang menang bergantung pada platform. Pada Linux, pasang peraturan sebelum peraturan Tailscale sendiri supaya alamat tempatan menggunakan jadual utama:

sudo ip rule add to 192.168.1.0/24 priority 2500 lookup main

Peraturan tersebut tidak kekal dan akan hilang pada but semula seterusnya. Penyelesaian sebenar ialah memilih julat peribadi yang tidak akan anda temui di luar. 192.168.0.0/24 dan 192.168.1.0/24 adalah lalai pada kebanyakan penghala rumah, jadi pilih sesuatu di dalam 10.0.0.0/8 yang anda tentukan secara sengaja. Perlanggaran yang sama juga akan merosakkan VPN WireGuard biasa yang anda konfigurasikan secara manual, atas sebab yang sama: laluan tempatan yang lebih spesifik akan menang, jadi trafik tidak akan memasuki terowong tersebut.

Mod kegagalan: DNS meleraikan alamat yang tidak diliputi oleh laluan

Masalah ini sukar untuk dinyahpepijat kerana tiada ralat dilaporkan. Nama berjaya dileraikan, namun sambungan tamat masa.

Katakan db.internal.example.com meleraikan kepada 10.0.5.20 melalui pelayan nama peribadi anda, dan anda telah mengiklankan 10.0.0.0/24. Carian berjaya kerana peleraian DNS (domain name system) dan penghalaan IP adalah langkah yang berasingan dan kedua-duanya tidak menyemak antara satu sama lain. Kemudian, paket ke 10.0.5.20 tidak menemui laluan yang sepadan pada tailnet, jadi ia keluar melalui gateway lalai pelanggan dan hilang.

Dua arahan memisahkan kedua-dua bahagian ini:

nslookup db.internal.example.com
ip route get 10.0.5.20

Jika carian mengembalikan alamat tetapi ip route get tidak menjawab dengan dev tailscale0, nama tersebut adalah betul dan laluan yang hilang. Iklankan julat yang meliputi alamat tersebut, sama ada 10.0.0.0/16 atau prefiks eksplisit kedua, kemudian luluskan prefiks baharu tersebut dalam konsol.

Terdapat perangkap yang sepadan pada pelayan nama itu sendiri. Jika anda menetapkan pelayan nama global dalam konsol pentadbir pada alamat peribadi seperti 10.0.0.53, alamat tersebut mestilah berada di dalam laluan yang diluluskan, atau peranti anda tidak akan dapat mencapai penyelesai (resolver) tersebut sama sekali. Hidupkan pilihan yang mengatasi pelayan DNS tempatan sambil menghala ke penyelesai yang tidak dapat dicapai oleh sesiapa, dan setiap peranti dalam tailnet akan kehilangan peleraian nama serta-merta, termasuk peranti yang berfungsi seminit sebelumnya. Iklankan dan luluskan laluan ke penyelesai tersebut terlebih dahulu, kemudian tukar tetapan DNS. Jika DNS di dalam terowong adalah bahagian yang sentiasa menjadi masalah, cara DNS terputus melalui terowong WireGuard merangkumi mekanisme yang sama tanpa lapisan penyelarasan di atasnya.

Source NAT dan pautan tapak-ke-tapak

Secara lalai, penghala subnet menulis semula alamat sumber setiap paket yang dimajukan kepada alamat peribadinya sendiri. Ini ialah SNAT (source network address translation), dan ia wujud supaya balasan berfungsi tanpa mengubah apa-apa pada rangkaian peribadi: pangkalan data di 10.0.0.20 menjawab VPS, yang ia sudah tahu cara untuk dicapai. Kosnya ialah pangkalan data melihat setiap sambungan tailnet sebagai datang daripada VPS, jadi peraturan firewall dan log akses bagi setiap sumber tidak memberikan sebarang maklumat.

Matikan fungsi ini pada Linux apabila anda mahu alamat tailnet sebenar klien dikekalkan:

sudo tailscale set --snat-subnet-routes=false

Hos pada rangkaian peribadi kemudiannya memerlukan laluan balik ke 100.64.0.0/10, julat yang diberikan oleh Tailscale kepada peranti, yang menghala ke penghala subnet. Tanpa laluan balik tersebut, balasan mereka akan pergi ke get laluan lalai dan tidak akan sampai, menyebabkan sambungan tergantung selepas paket pertama. Tambahkan laluan statik pada get laluan rangkaian peribadi, atau biarkan SNAT dihidupkan.

Pautan tapak-ke-tapak ialah dua penghala subnet yang melakukan perkara ini serentak, masing-masing mengiklankan rangkaiannya sendiri dan menerima rangkaian pihak yang satu lagi:

sudo tailscale up --advertise-routes=10.0.0.0/24 --snat-subnet-routes=false --accept-routes

Jalankan arahan yang sepadan pada penghala satu lagi dengan julatnya sendiri. Kedua-dua julat tersebut mestilah berbeza. Jika pemindahan data yang besar terhenti manakala ssh dan ping berfungsi dengan baik, puncanya ialah MSS (maximum segment size), iaitu ketulan data terbesar yang dibawa oleh paket TCP. Overhed terowong menjadikan paket yang dimajukan terlalu besar untuk sesetengah pautan di tengah, dan pengapit (clamping) akan membetulkannya:

sudo iptables -t mangle -A FORWARD -o tailscale0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Simpan peraturan tersebut dengan iptables-persistent, atau ia akan hilang pada but seterusnya.

Penyelenggaraan untuk memastikan kelancaran operasi

Kunci nod akan tamat tempoh selepas 180 hari secara lalai, bermula Ogos 2026. Apabila kunci pada subnet router tamat tempoh, nod tersebut akan log keluar dan keseluruhan julat yang diiklankan menjadi tidak boleh dicapai, tanpa sebarang perubahan konfigurasi yang menjelaskan puncanya. Nyahdayakan tamat tempoh kunci untuk mesin ini pada halaman Machines dalam konsol pentadbir, kemudian catatkan tindakan tersebut.

Tailscale mengutamakan sambungan terus antara peer dan akan menggunakan pelayan relay sebagai sandaran apabila sambungan terus tidak dapat dicapai. Pelayan relay berfungsi dengan baik, namun ia menambah latensi. VPS dengan alamat awam adalah kes yang mudah: benarkan trafik masuk UDP 41641 dan kebanyakan peer akan bersambung secara terus. Jika ufw menguruskan firewall, peraturan ufw yang sebenarnya diperlukan oleh VPS merangkumi sintaks yang berkaitan.

Peraturan akses adalah bahagian yang seterusnya. Pada tailnet lalai, setiap peranti anda boleh mencapai peranti lain, jadi laluan yang diluluskan akan berfungsi secara automatik. Sebaik sahaja anda menulis polisi ACL, bahagian destinasi bagi sesuatu peraturan perlu menamakan julat peribadi tersebut, kerana 10.0.0.20 bukanlah alamat tailnet dan tidak dilindungi oleh peraturan yang ditulis berdasarkan IP atau tag tailnet.

Akhir sekali, tentukan sama ada anda mahukan pelayan koordinasi yang tidak diuruskan oleh anda sendiri. Control plane Tailscale merupakan perkhidmatan yang dihoskan. Kunci anda kekal pada mesin anda, tetapi akaun dan fail polisi disimpan di sana. Menjalankan Headscale, pelayan kawalan Tailscale yang dihoskan sendiri memastikan perkara tersebut kekal pada VPS anda sendiri, dengan kos penyelenggaraan yang perlu ditanggung. Jawapan lain bagi kebimbangan yang sama adalah dengan meninggalkan klien Tailscale, dan menghoskan sendiri pelayan VPN NetBird meletakkan lapisan koordinasi serta klien mesh miliknya pada satu mesin yang anda kawal. Jika anda masih membuat keputusan antara model ini dengan konfigurasi manual, perbandingan antara WireGuard dan Tailscale menjelaskan apa yang diberikan oleh lapisan koordinasi tersebut dan kos yang terlibat.

FAQ

Apakah perbezaan antara subnet router dan exit node?

Subnet router mengiklankan julat alamat peribadi supaya peranti dalam tailnet boleh mencapai mesin yang tidak menjalankan Tailscale. Exit node mengiklankan dirinya sebagai laluan ke seluruh internet, supaya peranti menghantar semua trafiknya keluar melalui alamat awam nod tersebut. Satu VPS boleh menjadi kedua-duanya. Ia adalah flag yang berasingan, --advertise-routes dan --advertise-exit-node, dan setiap satunya memerlukan kelulusan sendiri dalam konsol pentadbir.

Mengapa klien Linux saya mengabaikan laluan subnet yang diiklankan?

Klien Linux tidak menerima laluan subnet melainkan anda memintanya. 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 perutean 52 dan mencapainya melalui peraturan polisi, jadi jadual utama tidak akan menyenaraikannya dan laluan yang berfungsi kelihatan seolah-olah tiada.

Subnet saya berhenti berfungsi selepas but semula. Apa yang rosak?

IP forwarding, kemungkinan besar. Nilai yang ditetapkan dengan sysctl -w tidak kekal selepas but semula, jadi tulis nilainya ke dalam /etc/sysctl.d/99-tailscale.conf dan sahkan dengan sysctl net.ipv4.ip_forward. Jika forwarding dihidupkan dan julat tersebut masih tidak boleh dicapai, lihat nod tersebut dalam konsol pentadbir. Kunci nod tamat tempoh selepas 180 hari secara lalai, dan subnet router yang tamat tempoh kelihatan seperti kerosakan rangkaian dan bukannya masalah akaun.

Bolehkah dua subnet router mengiklankan julat yang sama?

Bukan julat yang serupa. Julat bertindih dengan panjang awalan yang berbeza adalah dibenarkan, dan yang paling spesifik akan digunakan. Failover memerlukan perhatian: apabila router yang memegang awalan lebih spesifik terputus talian, Tailscale tidak akan kembali ke laluan yang lebih luas, jadi trafik tersebut akan terhenti. Untuk pasangan sedia (standby) yang sebenar, pastikan kedua-dua router mengiklankan awalan spesifik yang sama.

Nama hos dapat diselesaikan (resolve) tetapi sambungan tamat masa. Mengapa?

Penyelesaian DNS dan perutean adalah langkah yang berasingan. Nama boleh diselesaikan kepada alamat yang tidak dilindungi oleh mana-mana laluan yang diluluskan, dan paket tersebut kemudian keluar melalui gateway lalai klien. Jalankan ip route get <address> pada klien. Jika jawapannya tidak merangkumi dev tailscale0, iklankan julat yang merangkumi alamat tersebut dan luluskan awalan baharu dalam konsol pentadbir.