Apa Itu Tailscale dan Bagaimana Cara Kerjanya?
Pahami Tailscale: tunnel WireGuard antarpeladen, server koordinasi untuk kunci dan ACL, traversal NAT, relay DERP, serta model ancaman yang perlu diketahui.
Apa itu Tailscale?
Tailscale adalah VPN yang menghubungkan mesin Anda secara langsung, bukan merutekan seluruh trafik melalui satu gateway yang Anda kelola. Setiap node menjalankan WireGuard, sehingga paket dikirim secara terenkripsi dari satu server ke server lain dan tidak ada pihak di sepanjang jalur yang dapat membacanya. Server koordinasi terkelola menangani proses perkenalan antar-node. Server ini menyimpan dan mendistribusikan kunci publik serta memberi tahu setiap node lokasi node lainnya. Server ini juga menerapkan aturan akses yang Anda tulis.
Pemisahan tersebut merupakan inti desainnya. Data plane menggunakan koneksi peer-to-peer dan dienkripsi antarnode. Control plane adalah layanan yang dijalankan Tailscale untuk Anda. Semua pertanyaan penting tentang Tailscale, termasuk pertanyaan yang sulit terkait kepercayaan, berasal dari dua fakta tersebut. Jika Anda sudah membangun VPN WireGuard secara manual pada VPS, Tailscale menyediakan tunnel yang sama, dengan distribusi kunci dan traversal firewall yang ditangani untuk Anda.
Bagaimana cara kerja Tailscale?
Jaringan privat node Anda disebut tailnet. Empat hal terjadi ketika sebuah mesin bergabung ke dalamnya.
- Daemon
tailscaledberjalan, membuat pasangan kunci WireGuard, dan menyimpan statusnya di/var/lib/tailscale/tailscaled.state. Kunci privat tetap berada di mesin tersebut. Tailscale menyatakannya dengan jelas: "kunci privat tidak pernah meninggalkan node-nya." - Node login ke server koordinasi dan mengunggah kunci publiknya, serta alamat tempat node tersebut diperkirakan dapat dijangkau. Tailscale mendeskripsikan server itu sebagai "drop box bersama untuk kunci publik."
- Server koordinasi mengirimkan peta jaringan: kunci publik, alamat tailnet, nama mesin, dan endpoint kandidat setiap node yang diizinkan untuk dijangkau oleh node ini.
- Setiap pasangan node kemudian mencoba membangun tunnel WireGuard langsung di antara keduanya. Jika gagal, keduanya meneruskan paket melalui relay.
Setiap node memperoleh alamat stabil dari 100.64.0.0/10, yaitu rentang carrier-grade NAT yang mencakup 100.64.0.0 hingga 100.127.255.255. Tailscale menggunakan rentang tersebut karena dicadangkan untuk infrastruktur provider, sehingga jarang bertabrakan dengan alamat privat yang sudah digunakan server Anda. Di Linux, tunnel muncul sebagai interface bernama tailscale0.
Implementasi WireGuard berada di dalam tailscaled dalam userspace, bukan di modul kernel. Karena itu, Tailscale dapat berjalan pada virtualisasi container ketika sudo modprobe wireguard gagal dengan Operation not supported. Konsekuensinya, batas throughput pada mesin tertentu lebih rendah daripada WireGuard dalam kernel. Ini merupakan salah satu kompromi yang dibahas dalam perbandingan Tailscale dengan WireGuard biasa.
Dua perintah dapat menunjukkan kondisi koneksi Anda.
tailscale ip -4
tailscale statustailscale status mencetak satu baris untuk setiap node. Kolom terakhir adalah bagian yang penting.
100.101.102.103 web-1 you@ linux -
100.101.102.104 db-1 you@ linux active; direct 198.51.100.24:41641
100.101.102.105 ci-runner you@ linux active; relay "fra"direct yang diikuti alamat dan port berarti kedua mesin menemukan jalur satu sama lain dan trafik berjalan secara peer-to-peer. relay "fra" berarti trafik melewati relay Tailscale di Frankfurt. - berarti saat ini tidak ada sesi aktif dengan node tersebut. Kondisi ini normal.
Hal yang dapat dan tidak dapat dilihat oleh coordination server
Coordination server menyimpan public key dan metadata. Server ini mengetahui nama mesin Anda, user atau tag yang memiliki setiap node, alamat tailnet setiap node, alamat publik yang dapat digunakan untuk menjangkau node Anda, waktu terakhir setiap node online, serta file kebijakan yang Anda tulis. Data tersebut membentuk peta lengkap fleet Anda.
Server ini tidak menyimpan private key, sehingga tidak dapat mendekripsi trafik antara dua node. Enkripsi berlangsung secara end-to-end antara peer WireGuard, sedangkan coordination server bukan peer.
Coordination server dapat membagikan key. Setiap coordination server, baik yang di-host oleh pihak lain maupun yang Anda jalankan sendiri, dipercaya untuk memberi tahu node Anda public key mana yang menjadi bagian dari tailnet. Hal ini menjadi inti model ancaman yang dibahas di bagian berikutnya dan menjadi alasan keberadaan Headscale, coordination server open-source yang Anda host sendiri.
Cara dua server di balik firewall berbeda berkomunikasi secara langsung
NAT (network address translation) memungkinkan banyak mesin berbagi satu alamat publik. VPS Anda biasanya memiliki alamat publik sendiri, tetapi mesin lain yang ingin Anda masukkan ke tailnet sering kali tidak memilikinya: server di rumah, build runner pada jaringan kantor, atau mesin di balik firewall provider yang tidak dapat Anda ubah.
Tailscale mencari jalur menggunakan teknik yang dibangun berdasarkan standar STUN (session traversal utilities for NAT) dan ICE. Setiap node mengirim paket UDP kecil ke server STUN, lalu mengetahui alamat publik dan port yang ditetapkan router untuk socket tersebut. Kedua node melaporkan kandidat itu ke server koordinasi, yang meneruskannya ke sisi lain. Setelah itu, kedua node mulai mengirim paket satu sama lain secara bersamaan. Setiap router melihat paket keluar terlebih dahulu, sehingga router membuat pemetaan dan menerima balasan yang datang dari alamat yang sama. Tidak ada sisi yang memerlukan aturan firewall inbound.
Port yang digunakan bersifat spesifik. Tunnel WireGuard langsung menggunakan UDP dengan source port default 41641. STUN berjalan melalui UDP 3478 menuju server relay Tailscale. Koneksi kontrol dan semua data yang direlay menggunakan HTTPS pada TCP 443. Biasanya Anda tidak perlu membuka port inbound apa pun. Namun, pada jaringan dengan NAT yang sulit, mengizinkan UDP 41641 inbound meningkatkan kemungkinan koneksi langsung.
tailscale netcheckBaca dua baris dari laporan tersebut. UDP: true berarti UDP dapat keluar dari mesin, sedangkan UDP: false berarti setiap koneksi dari node ini akan direlay. MappingVariesByDestIP: true berarti router menetapkan public port yang berbeda untuk setiap tujuan. Akibatnya, prediksi alamat di atas tidak dapat berfungsi dan node tersebut biasanya tetap menggunakan relay.
Saat Tailscale menggunakan relay DERP
DERP (designated encrypted relay for packets) adalah mekanisme fallback. Tailscale menjalankan relay di banyak region yang dapat dijangkau melalui TCP 443. Node yang tidak dapat membentuk jalur langsung mengirimkan paket WireGuard melalui salah satu relay tersebut.
Paket tetap terenkripsi. Tailscale menjelaskannya secara tegas: "server DERP tidak pernah dapat mendekripsi trafik Anda. Server tersebut hanya meneruskan trafik yang sudah terenkripsi secara buta dari satu node ke node lain." Relay melihat ciphertext dan dapat melihat node mana yang berkomunikasi dengan node mana.
Relay juga membawa paket pertama dari sebagian besar koneksi. Pencarian jalur langsung memerlukan waktu singkat. Karena itu, sesi sering kali dimulai melalui relay lalu beralih tanpa memutus sesi setelah kedua node menemukan satu sama lain. Anda dapat mengamati proses tersebut.
tailscale ping db-1Balasan pertama muncul melalui via DERP(fra). Kemudian, baris berikutnya melaporkan sesuatu seperti via 198.51.100.24:41641. Perubahan tersebut menunjukkan bahwa koneksi telah beralih ke tunnel langsung. Jika nilainya tidak pernah berubah, jalankan tailscale netcheck pada kedua sisi. Jalur melalui relay tetap berfungsi. Namun, latensinya lebih tinggi karena setiap paket harus melewati mesin ketiga sebagai jalur memutar.
Menggabungkan VPS ke tailnet
Skrip instalasi mendukung Ubuntu dan Debian.
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upsudo tailscale up mencetak URL. Buka URL tersebut, lakukan autentikasi, dan node akan muncul di konsol admin. Selanjutnya, pastikan daemon kembali berjalan setelah reboot karena langkah ini sering dilewati.
sudo systemctl is-enabled tailscaled
tailscale statusis-enabled harus mencetak enabled, dan tailscale status harus menampilkan node baru dengan alamat 100.x-nya. Untuk server yang dibuat dari skrip, URL interaktif tidak berguna. Buat auth key di konsol admin dan teruskan key tersebut bersama tag yang mencatat jenis mesin ini.
sudo tailscale up --auth-key=tskey-auth-REPLACE-ME --advertise-tags=tag:serverNode yang diberi tag dimiliki oleh tag tersebut, bukan oleh orang yang menjalankan perintah. Dengan demikian, node tetap berfungsi setelah akun orang tersebut dihapus. Tag harus dideklarasikan terlebih dahulu dalam policy file di bawah tagOwners, atau perintah akan ditolak. Pemberian tag juga mengubah cara mesin dihitung dalam plan Anda karena resource bertag dikenai harga secara terpisah dari perangkat milik pribadi seseorang. cakupan sebenarnya dari free tier menjelaskan batasan tersebut.
Dua pengaturan penting untuk fleet. Secara default, node key kedaluwarsa setelah 180 hari (per Agustus 2026). Saat key kedaluwarsa, "connections to/from the given endpoint will stop working" sampai seseorang login kembali. Karena itu, buka baris mesin tersebut di konsol admin dan pilih Disable Key Expiry pada server yang tidak diawasi.
MagicDNS, yang diaktifkan secara default untuk tailnet yang dibuat pada atau setelah 20 October 2022, memberikan nama kepada setiap node, misalnya db-1.yak-bebop.ts.net. Nama tersebut di-resolve oleh stub resolver di 100.100.100.100. Gunakan nama, bukan alamat, karena node yang dibuat ulang akan memperoleh alamat baru tetapi tetap menggunakan namanya.
Jika instalasi gagal pada apt atau repository, kesalahan instalasi Tailscale yang umum di Ubuntu membahas solusinya.
Mengakses service yang terikat ke localhost
Di sinilah tailnet berguna, sekaligus menjadi bagian yang sering membingungkan. Bergabung ke tailnet tidak membuat service loopback dapat diakses.
ss -tlnp | grep 3000Jika perintah tersebut menampilkan 127.0.0.1:3000, socket hanya menerima paket yang alamat tujuannya 127.0.0.1. Permintaan dari node lain tiba dengan alamat 100.x milik node ini sebagai alamat tujuan, sehingga kernel tidak memiliki listener untuk permintaan tersebut dan mengirim TCP reset. Client melaporkan Connection refused. Tunnel tidak bermasalah. Masalahnya ada pada listener.
Ada dua solusi yang tepat. Ikat service ke alamat tailnet node agar service tetap tidak terekspos pada interface publik tanpa proxy di antaranya: berikan --bind 100.101.102.104 atau opsi yang setara dalam konfigurasi Anda, dan untuk container, publish port sebagai -p 100.101.102.104:3000:3000. Atau, biarkan service tetap menggunakan loopback dan tempatkan Tailscale di depannya.
tailscale serve 3000Konfigurasi tersebut mem-proxy permintaan ke http://127.0.0.1:3000 dan menyediakannya di dalam tailnet melalui nama ts.net menggunakan HTTPS, setelah sertifikat HTTPS diaktifkan untuk tailnet. Service tersebut tetap privat dan hanya dapat diakses oleh node Anda. Versi publik dari konsep yang sama adalah Funnel. Tailscale serve dengan funnel menjelaskan pilihan yang sesuai.
Dua kebutuhan terkait memiliki halaman tersendiri. Untuk mengakses seluruh jaringan privat yang tidak memasang Tailscale, gunakan subnet router pada VPS. Untuk mengarahkan trafik Internet keluar dari sebuah node melalui node lain, gunakan exit node.
Menutup port yang tidak lagi diperlukan
Setelah semua administrator dapat mengakses server melalui tailnet, port publik 22 tidak lagi diperlukan. Inilah manfaat praktisnya: port yang ditutup tidak dapat menjadi sasaran brute force, dan log Anda tidak lagi dipenuhi percobaan tersebut.
Urutan langkah penting. Tambahkan akses tailnet, pastikan Anda dapat login melalui akses tersebut dari sesi kedua, lalu hapus aturan publik.
sudo ufw allow in on tailscale0
sudo ufw status verboseSetelah itu, hapus aturan SSH publik dan sambungkan kembali menggunakan nama MagicDNS. Perhatikan fungsi sebenarnya dari ufw allow in on tailscale0: aturan ini memercayai semua koneksi yang masuk melalui tunnel, sehingga file kebijakan Tailscale menjadi kontrol akses, bukan ufw. Tulis kebijakan dengan mempertimbangkan hal tersebut.
Perhatian bagi siapa pun yang menjalankan container. Port Docker yang dipublikasikan memasang aturan NAT sendiri dan melewati ufw, sehingga ufw deny tidak menutupnya. Port Docker yang dipublikasikan melewati ufw menjelaskan mekanismenya. Memublikasikan port ke alamat tailnet, seperti di atas, menghindari masalah tersebut.
Hal yang dilindungi Tailscale dan hal yang tidak dilindunginya
Hal ini perlu dinyatakan secara langsung karena versi pemasaran sering mengaburkan batasnya.
Dilindungi: trafik antara dua node dienkripsi secara end-to-end dengan WireGuard, dan tidak ada relay di tengah yang dapat membacanya. Kunci privat tidak pernah meninggalkan mesin yang membuatnya. Node tidak memerlukan port publik masuk, sehingga tidak ada layanan pada port 22 atau 5432 yang dapat dipindai oleh Internet. Akses antar-node ditentukan oleh file kebijakan, bukan oleh siapa pun yang mengetahui suatu alamat.
Tidak dilindungi: server koordinasi dapat melihat graf perangkat Anda. Metadata ini sensitif karena nama mesin, pemilik, alamat, dan waktu online menggambarkan infrastruktur Anda. Server tersebut juga mendistribusikan kunci, yang merupakan risiko lebih besar. Tailscale menyatakannya secara langsung: "Jika Tailscale berbahaya dan diam-diam menyisipkan node baru ke jaringan Anda, Tailscale dapat mengirim atau menerima trafik ke node yang sudah ada dalam bentuk plaintext." Penyedia single sign-on Anda berada dalam jalur kepercayaan yang sama karena siapa pun yang dapat menerbitkan identitas di sana dapat menambahkan node. Node yang telah dibobol juga merupakan peer di dalam tailnet, sehingga hal yang dapat dijangkaunya berikutnya ditentukan oleh kebijakan Anda. Apakah hal ini merupakan risiko yang dapat diterima bergantung pada pihak yang ingin Anda hadapi, dan model kepercayaan lengkap membahas setiap kasus tersebut, termasuk tindakan yang benar-benar dapat dilakukan menggunakan akun identitas yang dicuri.
Ada dua cara untuk menangani risiko distribusi kunci. Cara pertama adalah tailnet lock, yang mengharuskan node tepercaya yang sudah ada menandatangani node baru secara kriptografis sebelum node lain menerimanya. Control plane yang menambahkan node tanpa tanda tangan valid akan diabaikan. Konsol admin membuat baris tailscale lock init yang tepat untuk node penanda tangan Anda, dan setiap node dapat mengonfirmasi hal yang diterimanya.
tailscale lock statusSemua node harus melaporkan kumpulan kunci penanda tangan tepercaya yang sama. Cara kedua adalah menjalankan control plane sendiri. Server koordinasi Headscale yang di-host sendiri menggunakan protokol yang sama dengan klien yang sama, sehingga graf perangkat dan distribusi kunci dipindahkan ke perangkat keras milik Anda. Dengan demikian, Anda juga bertanggung jawab atas uptime server tersebut. Jika Anda masih membandingkan control plane yang di-host sendiri dan belum memilih solusi ini, NetBird adalah mesh VPN terpisah yang servernya Anda jalankan sepenuhnya pada satu VPS.
Ada satu default yang harus diperbaiki pada hari pertama. tailnet baru menggunakan pengaturan permisif: "file kebijakan tailnet default mengaktifkan komunikasi antara semua perangkat dalam tailnet." Segera setelah Anda menambahkan bagian acls, modelnya berubah menjadi deny secara default dan hanya aturan Anda yang dapat melewati kebijakan tersebut.
{
"tagOwners": {
"tag:server": ["autogroup:admin"]
},
"acls": [
{"action": "accept", "src": ["autogroup:member"], "dst": ["tag:server:22"]}
]
}Kebijakan tersebut memungkinkan anggota tailnet mengakses SSH pada server bertag dan tidak mengakses layanan lain. Tambahkan satu aturan untuk setiap layanan, bukan membiarkan wildcard, karena wildcard berarti satu kunci laptop yang dicuri dapat mengakses database Anda.
Mode kegagalan dan string yang akan Anda lihat
tailscale status selalu menampilkan relay. Kedua node tidak pernah membangun jalur langsung. Jalankan tailscale netcheck di kedua sisi. UDP: false berarti UDP diblokir untuk trafik keluar, sehingga hanya relay yang dapat digunakan. MappingVariesByDestIP: true berarti ada NAT ketat yang menghalangi, dan mengizinkan UDP 41641 masuk pada sisi yang Anda kendalikan sering kali dapat mengatasinya.
Node yang berfungsi selama berbulan-bulan tiba-tiba menghilang. Kunci node tersebut kedaluwarsa setelah 180 hari, sesuai default. Mesin ditampilkan sebagai kedaluwarsa di konsol admin, dan sudo tailscale up pada mesin tersebut akan mengaktifkannya kembali. Nonaktifkan kedaluwarsa kunci pada server agar masalah ini tidak terulang.
Peer tercantum, tetapi koneksi mengalami timeout. Konektivitas berfungsi, dan kebijakan menolak trafik tersebut. Periksa bagian acls untuk menemukan aturan yang mencakup sumber, tujuan, dan port ini. Paket yang ditolak akan dibuang tanpa balasan. Karena itu, Anda mendapatkan timeout, bukan Connection refused.
Nama MagicDNS tidak dapat di-resolve. ping db-1 gagal, sedangkan ping 100.101.102.104 berhasil. Sesuatu mengganti /etc/resolv.conf, sehingga kueri tidak pernah mencapai stub resolver di 100.100.100.100. Periksa cat /etc/resolv.conf untuk mencari 100.100.100.100, lalu periksa hal lain pada mesin yang menulis file tersebut. Ini adalah jenis masalah yang sama dengan DNS yang rusak di dalam tunnel WireGuard.
tailscale up menolak tag Anda. Tag tersebut belum dideklarasikan di bawah tagOwners dalam file kebijakan. Tambahkan tag itu di sana, lalu jalankan kembali perintahnya.
FAQ
Apakah Tailscale merupakan VPN atau jaringan mesh?
Kedua istilah tersebut benar, tetapi menjelaskan lapisan yang berbeda. Tunnel-nya menggunakan WireGuard, sehingga Tailscale merupakan VPN. Topologinya adalah mesh karena setiap node membuat tunnel langsung ke setiap node yang diajak berkomunikasi, bukan mengirim setiap paket melalui satu server pusat. Server koordinasi berada pada jalur kontrol, bukan jalur data. Karena itu, jika server tersebut tidak dapat dijangkau, tunnel yang sudah ada tetap meneruskan trafik. Yang terhenti saat terjadi gangguan adalah proses penambahan node baru serta penerapan perubahan key atau policy.
Apakah Tailscale dapat membaca trafik saya?
Tidak dapat membaca isinya. Trafik dienkripsi secara end-to-end antara node menggunakan WireGuard, private key tidak pernah meninggalkan node, dan relay DERP meneruskan paket yang tidak dapat didekripsinya. Tailscale tetap dapat melihat metadata: nama mesin, pemilik, public key, alamat endpoint, dan waktu setiap node online. Tailscale juga mendistribusikan key, sehingga coordination server yang telah dibobol dapat mencoba memasukkan node yang kemudian dipercaya oleh seluruh fleet Anda. Tailnet lock mencegah hal ini dengan mewajibkan signature dari node tepercaya milik Anda sendiri, sedangkan Headscale menghilangkan hosted control plane dari arsitektur tersebut.
Apakah saya perlu membuka port firewall untuk Tailscale?
Hampir tidak pernah untuk koneksi inbound. Panduan Tailscale menyatakan bahwa "most of the time, you don't need to open any firewall ports." Untuk koneksi outbound, node memerlukan TCP 443 ke coordination server dan relay, serta UDP 3478 untuk STUN. Tunnel langsung menggunakan UDP dengan source port yang secara default bernilai 41641. Mengizinkan UDP 41641 inbound bersifat opsional dan hanya membantu koneksi langsung berhasil pada jaringan yang memiliki pembatasan tertentu.
Mengapa node lain tidak dapat menjangkau service saya pada port 3000?
Periksa alamat bind terlebih dahulu dengan ss -tlnp. Listener pada 127.0.0.1:3000 menolak koneksi yang ditujukan ke alamat tailnet 100.x milik node tersebut karena socket itu hanya menerima destination loopback, sehingga client menerima Connection refused. Bind service ke alamat tailnet, atau jalankan tailscale serve 3000 untuk melakukan proxy. Jika listener sudah menggunakan 0.0.0.0 dan koneksi justru timeout, bukan ditolak, penyebabnya adalah policy rule atau host firewall, bukan alamat bind.
Apakah saya sebaiknya menjalankan Headscale, bukan coordination server milik Tailscale?
Jalankan Headscale jika graph perangkat atau distribusi key harus tetap berada pada infrastruktur yang Anda kendalikan, atau jika tailnet harus berfungsi tanpa bergantung pada service eksternal. Client dan protokolnya sama. Konsekuensinya, Anda harus mengoperasikan coordination server sendiri. Jika server tersebut mengalami gangguan, node baru tidak dapat bergabung dan perubahan policy tidak dapat diterapkan. Untuk fleet kecil, hosted control plane dengan tailnet lock yang diaktifkan biasanya memberikan kompromi yang lebih baik.