Ringkasan Utama
Tailscale membangun jaringan mesh terenkripsi di atas WireGuard, memberi setiap server, laptop, dan perangkat homelab alamat IP privat yang stabil serta koneksi peer-to-peer langsung tanpa melewati satu gateway VPN. Panduan ini membahas instalasi Tailscale, membuka akses ke subnet homelab lewat router node, mengunci akses dengan ACL, dan menghosting sendiri control plane-nya lewat Headscale.
Setiap developer pada akhirnya menghadapi masalah yang sama: database di sebuah VPS yang seharusnya tidak pernah tersentuh internet publik, NAS homelab di belakang router rumahan tanpa IP statis, dan laptop yang perlu menjangkau keduanya tanpa membuka satu pun port. VPN tradisional menyelesaikan ini dengan gateway pusat yang justru menjadi bottleneck dan titik kegagalan tunggal. Tailscale mengambil pendekatan yang sama sekali berbeda.
Tailscale membangun jaringan mesh di atas WireGuard, di mana setiap perangkat mendapat IP privat yang stabil dan berkomunikasi langsung dengan perangkat lain melalui terowongan terenkripsi, di mana pun perangkat itu secara fisik berada. Tulisan ini membahas cara instalasi di server dan homelab, mengunci lalu lintas dengan access control list, mengekspos seluruh subnet lewat node router, dan akhirnya menggantikan server koordinasi hosted milik Tailscale dengan instance Headscale yang di-self-host sendiri.
Mengapa mesh lebih baik dari VPN hub and spoke
VPN klasik merutekan setiap paket melalui satu gateway. Gateway itu harus berskala mengikuti total trafik, menjadi satu-satunya hal yang bisa menjatuhkan seluruh jaringan jika gagal, dan menambah satu hop latensi pada setiap koneksi bahkan antara dua mesin yang berada di data center yang sama. Jaringan mesh membalik ini: server kontrol hanya menangani autentikasi dan pertukaran kunci publik, sementara data sesungguhnya berjalan peer to peer kapan pun jalur langsung tersedia.
- Koneksi peer to peer langsung berarti dua server di region yang sama saling berkomunikasi dengan hampir tanpa tambahan latensi, karena paket tidak pernah keluar dari segmen jaringan lokal.
- Tidak ada satu gateway pun yang bisa kelebihan beban, sehingga menambahkan seratus perangkat lagi ke tailnet tidak menurunkan throughput antar perangkat yang sudah terhubung.
- Jika server koordinasi sempat offline, koneksi peer yang sudah ada tetap berjalan karena kunci WireGuard sudah dipertukarkan dan disimpan secara lokal.
Mulailah dengan menginstal Tailscale di tepat dua mesin, laptop rumah dan satu server cloud, lalu pastikan Anda bisa melakukan ping ke server melalui IP privat yang diberikan sebelum menambahkan apa pun lagi. Membuat mesh terkecil yang berfungsi lebih dulu membuat setiap langkah berikutnya, ACL, subnet route, self-hosting, jauh lebih mudah untuk di-debug.
Menginstal Tailscale dan bergabung ke tailnet
Klien terinstal dengan cara yang sama di Linux, macOS, dan Windows, dan proses pertama akan memandu Anda melalui autentikasi berbasis browser ke penyedia identitas Anda. Setelah terautentikasi, perangkat diberi IP stabil pada rentang 100.64.0.0 hingga 100.127.255.255 yang tidak pernah berubah meski Anda bergabung kembali ke jaringan di kemudian hari. MagicDNS kemudian memberikan setiap perangkat hostname yang mudah dibaca seperti homelab-nas titik nama tailnet Anda, sehingga Anda hampir tidak pernah perlu menghafal alamat IP sama sekali.
# Install on a Linux server
curl -fsSL https://tailscale.com/install.sh | sh
# Authenticate and join the tailnet
sudo tailscale up
# Check assigned IP and hostname
tailscale ip -4
tailscale status
# Ping another node by its MagicDNS name
ping homelab-nas.tailnet-name.ts.netMenjangkau seluruh subnet dengan subnet router
Menginstal klien di setiap perangkat dalam homelab tidak selalu praktis, terutama untuk perangkat embedded, printer, atau appliance NAS yang tidak menjalankan sistem operasi umum. Subnet router menyelesaikan ini dengan mengumumkan seluruh rentang jaringan lokal ke tailnet dari satu mesin yang memang menjalankan klien, sehingga setiap perangkat lain di mesh bisa menjangkau apa pun di subnet itu tanpa menginstal apa-apa lagi.
- Aktifkan forwarding IPv4 dan IPv6 pada mesin yang akan berperan sebagai router, karena Tailscale mengandalkan kernel untuk meneruskan paket antara antarmuka tailnet dan antarmuka jaringan lokal.
- Jalankan klien dengan flag advertise routes diisi rentang CIDR subnet lokal, misalnya LAN milik router itu sendiri, sehingga server kontrol tahu perangkat ini bisa menjangkau rentang tersebut.
- Setujui route yang diumumkan dari admin console, karena route yang belum disetujui diabaikan secara default sebagai langkah pengaman terhadap kebocoran jaringan yang tidak diinginkan.
# Enable IP forwarding on the router node
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
# Advertise the homelab's LAN subnet
sudo tailscale up --advertise-routes=192.168.1.0/24
# On another device, accept the route from the admin console,
# then enable it locally if using the CLI approval flow
sudo tailscale up --accept-routesSubnet router yang mengumumkan 0.0.0.0/0 atau rentang yang terlalu luas bisa secara tidak sengaja mengekspos jauh lebih banyak jaringan Anda daripada yang dimaksudkan. Selalu umumkan blok CIDR paling sempit yang hanya mencakup perangkat yang benar-benar ingin Anda jangkau, dan periksa ulang daftar route yang disetujui di admin console setelah setiap perubahan.
Mengunci lalu lintas dengan access control list
Secara default setiap perangkat di tailnet bisa menjangkau setiap perangkat lain, yang baik-baik saja untuk uji coba dua mesin tetapi bukan yang Anda inginkan begitu server, laptop, dan akun kontraktor rekan kerja berbagi mesh yang sama. File kebijakan tailnet, ditulis dalam sintaks mirip JSON bernama HuJSON, memungkinkan Anda mendefinisikan tag untuk kelompok perangkat lalu menulis aturan accept eksplisit yang menjelaskan tepatnya kelompok mana yang boleh menjangkau port mana pada kelompok lain.
{
"tagOwners": {
"tag:server": ["autogroup:admin"],
"tag:homelab": ["autogroup:admin"]
},
"acls": [
{
"action": "accept",
"src": ["autogroup:member"],
"dst": ["tag:homelab:22,80,443,8080"]
},
{
"action": "accept",
"src": ["tag:server"],
"dst": ["tag:server:5432,6379"]
}
],
"ssh": [
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["tag:server"],
"users": ["autogroup:nonroot"]
}
]
}| Konsep | Fungsinya | Catatan praktis |
|---|---|---|
| Tag | Melabeli perangkat berdasarkan peran, bukan pemilik, misalnya server atau homelab. | Tag tetap ada meski perangkat didaftarkan ulang, berbeda dengan aturan per pengguna. |
| ACL rule | Pernyataan accept eksplisit yang menyebutkan sumber, tujuan, dan port yang diizinkan. | Semua yang tidak diizinkan secara eksplisit akan ditolak begitu ada satu aturan. |
| Autogroup | Kelompok bawaan seperti members atau admin yang merujuk pada peran akun. | Berguna untuk aturan yang berlaku untuk setiap pengguna manusia, bukan tag tertentu. |
| SSH check | Blok kebijakan yang mengatur akses SSH melalui fitur SSH milik Tailscale sendiri. | Menghilangkan kebutuhan mendistribusikan kunci SSH terpisah ke setiap server. |
Self-hosting control plane dengan Headscale
Server koordinasi hosted milik Tailscale gratis untuk penggunaan pribadi dan menangani autentikasi, pertukaran kunci, serta fallback relay DERP untuk Anda, tetapi beberapa tim ingin control plane itu sendiri berjalan di infrastruktur milik mereka, baik untuk kepatuhan, biaya pada skala besar, atau sekadar penasaran. Headscale adalah implementasi ulang open source dan dikelola komunitas dari server kontrol tersebut yang berbicara protokol yang sama dengan klien resmi Tailscale, sehingga skrip instalasi dan perintah CLI yang sama bekerja tanpa modifikasi terhadapnya.
- Headscale hadir sebagai satu binary Go tunggal atau image container, dan deployment minimal hanya membutuhkan file konfigurasi, database SQLite atau Postgres, serta endpoint HTTPS yang terekspos.
- Klien resmi Tailscale terhubung ke server Headscale dengan menyertakan flag login server berisi URL server Anda, menggantikan endpoint koordinasi default milik Tailscale.
- Headscale tidak menyertakan jaringan relay DERP hosted secara default, sehingga perangkat di belakang NAT yang ketat tanpa konektivitas langsung mungkin memerlukan Anda menjalankan relay sendiri atau mengarah ke server DERP publik milik Tailscale.
# docker-compose.yml
services:
headscale:
image: headscale/headscale:0.23.0
container_name: headscale
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./config:/etc/headscale
- ./data:/var/lib/headscale
command: headscale serve
# Register a new device against your own control server
sudo tailscale up --login-server=https://vpn.example.comHeadscale dikelola komunitas dan bukan produk resmi Tailscale, tetapi secara sengaja menargetkan kompatibilitas protokol dengan klien Tailscale asli, sehingga Anda tetap mendapatkan pengalaman instalasi yang sama seperti yang sudah dikenal tim Anda sambil memiliki control plane sendiri.
Daftar periksa sebelum benar-benar berkomitmen
Sebelum memperlakukan mesh VPN apa pun sebagai infrastruktur produksi untuk server sungguhan, kerjakan daftar periksa singkat ini agar kesalahan konfigurasi tidak berubah menjadi downtime atau, lebih buruk, kebocoran yang tidak disengaja.
- Pastikan file kebijakan tailnet menolak lalu lintas secara default dan setiap aturan accept merujuk pada tag bukan perangkat individual, sehingga menghapus satu server tidak diam-diam membuka celah.
- Uji apakah route yang diumumkan oleh subnet router tetap bertahan setelah mesin itu di-reboot, karena pengaturan forwarding yang hanya tertulis pada state kernel yang berjalan akan hilang saat restart.
- Verifikasi bahwa MagicDNS mampu me-resolve setiap hostname yang akan Anda rujuk dalam skrip atau tooling deployment, karena kesalahan penulisan hostname gagal secara diam-diam sebagai error pencarian DNS bukan penolakan izin yang jelas.
- Jika self-hosting Headscale, siapkan backup otomatis untuk database-nya, karena kehilangan database itu berarti setiap perangkat harus mendaftar dan autentikasi ulang dari awal.
Mesh VPN yang dibangun di atas WireGuard menghilangkan satu kategori penuh masalah jaringan: tidak perlu lagi membuka lubang firewall secara manual, tidak perlu lagi berurusan dengan IP rumahan yang dinamis, dan tidak ada lagi titik kegagalan tunggal antara laptop Anda dan server yang perlu Anda SSH pada pukul dua pagi. Baik Anda tetap menggunakan control plane hosted milik Tailscale atau berpindah ke instance Headscale yang di-self-host, mesh yang mendasarinya berperilaku sama, yang menjadikannya infrastruktur langka yang bisa Anda adopsi secara bertahap tanpa terkunci pada control plane satu vendor selamanya.

