Maskot beruang kutub NordBastion berdiri di sebuah aula batu Nordik yang gelap dengan satu cakar bertumpu pada obelisk keystone berukir rune, sebuah cincin holografik cyan berisi kunci melayang di atasnya, dan lima glyph perangkat yang bercahaya — laptop, ponsel, tablet, menara server, dan globe — saling terhubung langsung satu sama lain dalam jalinan mesh cyan terang di atasnya, sementara garis-garis kunci putus-putus samar jatuh dari cincin itu ke masing-masing perangkat, dengan rak server dan jendela melengkung yang diterangi aurora di belakangnya
How-to · Jaringan privat·19 menit membaca · 50 menit praktik

Server kontrol Anda sendiri.
Peta itulah yang layak untuk dipegang sendiri.

VPN mesh butuh seseorang yang membagikan kunci-kuncinya. Dengan Tailscale, pihak itu adalah sebuah perusahaan; dengan WireGuard biasa, pihak itu adalah Anda sendiri, secara manual, selamanya. Headscale adalah jawaban ketiga: klien open-source yang sama, tapi berbicara dengan server koordinasi di sebuah mesin yang Anda sewa secara anonim. Enam langkah menuju tailnet yang peta perangkatnya, aturan aksesnya, dan relay cadangannya sepenuhnya milik Anda — Headscale di belakang Caddy, ACL yang tertulis jelas, MagicDNS yang diarahkan ke resolver Anda sendiri, subnet router, exit node, dan DERP tertanam. Mesinnya hanya $3.90 sebulan. Sudah diuji di Debian 12.

Enam langkah
  1. 01

    Pilih

    WireGuard, Tailscale, atau Headscale

  2. 02

    Sediakan

    Tiga nama yang ditetapkan sebelum boot

  3. 03

    Deploy

    Headscale, Caddy, satu konfigurasi

  4. 04

    Daftarkan

    User, kunci pra-auth, klien

  5. 05

    Rutekan

    Subnet, exit node, ACL

  6. 06

    Simpan

    DERP, backup, upgrade

Sebelum memulai · Apa itu control plane

Tidak ada yang bisa membaca trafiknya. Tapi tetap ada yang memegang petanya.

WireGuard memang sengaja dibuat tidak lengkap. Ia adalah tunnel yang kecil, cepat, dan bisa diaudit antara dua kunci publik, dan sama sekali tidak punya pendapat soal bagaimana kedua kunci itu saling menemukan. Ketiadaan itu justru sebabnya protokol ini sebagus sekarang — dan itu juga sebabnya jaringan WireGuard berisi lima belas perangkat berubah menjadi sebuah spreadsheet. Setiap peer butuh kunci publik dan alamat terkini dari semua peer lainnya, dan setiap laptop yang berpindah antara kantor, kereta, dan hotel membuat sebagian dari spreadsheet itu tidak berlaku lagi.

VPN mesh adalah jawaban untuk masalah spesifik itu, dan bentuknya layak dijelaskan dengan tepat, karena itulah yang menentukan apa yang sebenarnya Anda percayakan. Data plane-nya tetap persis seperti semula: setiap perangkat membuat pasangan kuncinya sendiri secara lokal, menyimpan bagian privatnya, dan mengenkripsi langsung ke sesama peer-nya. Di atasnya berdiri sebuah control plane — layanan kecil yang mengumpulkan kunci publik dan endpoint, memberi tiap perangkat daftar peer yang boleh diajaknya bicara, dan membantu dua perangkat di balik router yang bermusuhan saling menemukan. Layanan itu tidak pernah memegang kunci privat dan tidak pernah melihat satu byte pun data mentah (plaintext).

Yang dipegangnya adalah peta, dan peta itu jauh lebih menarik daripada yang dikira kebanyakan orang. Setiap nama perangkat dan setiap nama user. Setiap kunci publik. Alamat publik tempat masing-masing perangkat sedang terhubung saat ini, yang merupakan catatan langsung di mana laptop dan ponsel Anda secara fisik berada. Waktu setiap perangkat terhubung dan terputus, yang menggambarkan keseharian Anda. Dan kebijakan yang menentukan siapa boleh menjangkau apa, yang menggambarkan organisasi Anda. Tidak satu pun dari itu membutuhkan niat buruk dari siapa pun; itu semata-mata memang untuk itulah server koordinasi ada.

Ada satu sifat lagi yang lebih penting daripada sekadar metadata. Control plane adalah pihak yang mendistribusikan kunci, jadi ia juga pihak yang bisa menambahkan satu kunci baru. Server kontrol yang diretas, atau dipaksa, bisa memberi tahu perangkat Anda bahwa sebuah mesin baru adalah anggota sah jaringan — dan perangkat Anda, hanya menjalankan tugas yang memang dirancang untuknya, akan mengenkripsi ke mesin itu. Tailscale menganggap ini cukup serius sampai membangun fitur signing khusus untuk melawannya. Self-hosting menyelesaikan masalah yang sama dari arah berlawanan: pihak yang bisa melakukannya kini adalah Anda sendiri. Empat susunan berikut, dan apa yang sesungguhnya diserahkan oleh masing-masing:

Properti WireGuard manual Tailscale, terkelola Headscale di VPS Anda Headscale + DERP milik Anda sendiri
Siapa yang bisa membaca payload-nyaTidak ada, kecuali sesama peerTidak ada, kecuali sesama peerTidak ada, kecuali sesama peerTidak ada, kecuali sesama peer
Siapa yang memegang peta perangkatAnda, dalam sebuah file teksSebuah perusahaan, dalam yurisdiksinya sendiriAnda, di VPS Anda sendiriAnda, di VPS Anda sendiri
Siapa yang melihat dari mana perangkat terhubungHanya sesama peer itu sendiriServer koordinasi, secara terus-menerusServer Anda, secara terus-menerusServer Anda, secara terus-menerus
Siapa yang me-relay saat koneksi langsung gagalTidak ada — koneksinya begitu saja gagalArmada relay milik providerTetap relay milik provider, secara defaultRelay Anda, di datacenter Anda
Menambahkan perangkat kedua puluhSembilan belas kali edit konfigurasiSatu perintahSatu perintahSatu perintah
Pilih ini jikaSedikit perangkat, tidak ada yang berpindah-pindahAnda ingin nol operasional dan rela menyerahkan peta ituAnda menginginkan peta itu dan sanggup menjalankan satu mesin kecilAnda menginginkan peta itu, sekaligus jalur cadangannya

Kolom pertama bukan argumen jerami. Untuk segelintir server yang statis, WireGuard yang ditulis manual memang benar-benar jawaban rekayasa yang lebih baik, dan itu berarti satu layanan lebih sedikit yang perlu di-patch. Panduan ini justru membahas titik di mana spreadsheet-nya berhenti terasa lucu.

Langkah 01 · Pilih

Apakah Anda butuh control plane? Hitung perangkat yang berpindah-pindah.

Ada tiga jawaban jujur untuk "saya ingin mesin-mesin saya saling menjangkau secara privat", dan hanya satu yang dibahas panduan ini. WireGuard biasa adalah yang paling minimal: satu modul kernel, satu file konfigurasi per peer, tidak ada daemon selain interface-nya, dan tidak ada yang perlu terus diperbarui selain sistem operasinya. Kalau perangkat Anda adalah server-server dengan alamat tetap dan jumlahnya bisa dihitung dengan sebelah tangan, berhenti di sini dan baca panduan WireGuard kami saja. Anda akan berakhir dengan lebih sedikit perangkat lunak dan daftar hal yang bisa rusak yang jauh lebih pendek.

Tailscale adalah yang paling lengkap: WireGuard yang sama di baliknya, ditambah layanan koordinasi, NAT traversal yang bekerja dari balik hampir semua jaringan, armada relay di beberapa benua, konsol web, single sign-on, dan kontrak dukungan. Ini perangkat lunak yang benar-benar unggul, dan tingkatan gratisnya sudah cukup untuk kebutuhan satu rumah tangga. Harganya bukan dalam bentuk uang — melainkan bahwa peta setiap perangkat yang Anda miliki, beserta catatan dari mana masing-masing tersambung, tersimpan di database milik sebuah perusahaan.

Headscale adalah jawaban ketiga, dan cakupannya lebih sempit daripada keduanya: sebuah reimplementasi open-source dari server koordinasi, yang dijalankan oleh Anda sendiri, dan tetap diajak bicara oleh klien resmi yang sama. Anda tetap mendapatkan otomatisasi dan NAT traversal-nya; sebagai gantinya Anda mengambil alih sebuah layanan kecil yang harus dioperasikan, fitur yang tidak selengkap versi aslinya, dan pembaruan yang perlu dibaca baik-baik. Jangan ada yang berpura-pura itu gratis. Yang didapat hanya satu hal, dan itulah yang menjadi perhatian utama situs ini: tidak ada pihak lain yang memegang petanya.

Ambang batas lima perangkat

Konfigurasi WireGuard manual tumbuh sebanding kuadrat jumlah armadanya: empat peer berarti enam koneksi, sepuluh peer berarti empat puluh lima, dua puluh peer berarti seratus sembilan puluh. Tambahkan satu laptop yang berpindah-pindah, yang endpoint-nya berubah setiap kali berganti jaringan, dan perawatannya berhenti menjadi hal yang sesekali saja. Dalam praktiknya titik baliknya ada di sekitar lima perangkat, atau begitu perangkat pertama berpindah setiap hari, atau begitu Anda butuh aturan akses yang tidak bisa lagi diungkapkan sebagai "semua orang bisa menjangkau semuanya".

Satu hal lagi yang sebaiknya diputuskan sekarang, bukan nanti, karena ini memengaruhi apa yang Anda pasang: apakah jaringan ini hanya untuk Anda sendiri, atau akan dimasuki orang lain juga. Tailnet untuk satu orang bisa dibiarkan terbuka lebar secara internal tanpa masalah apa pun. Tailnet yang ada kolega, kontraktor, atau anggota keluarga di dalamnya butuh aturan akses tertulis sejak minggu pertama — langkah 05 — dan butuh user yang terpisah, bukan semua orang berbagi satu login. Memutuskan ini di awal hanya makan satu paragraf; membenahinya belakangan makan waktu satu sore penuh.

Langkah 02 · Siapkan

Tiga nama, diputuskan sebelum boot pertama. Ketiganya sulit diubah.

Pesan mesinnya dulu. Di panel: Order → VPS → Sentinel, image Debian 12, di bastion mana pun tempat Anda ingin peta ini bermukim — Helsinki, Stockholm, Oslo, atau Reykjavík. Tidak perlu alamat email untuk membuka akun, dan tagihannya bisa dilunasi dengan Monero, Bitcoin, Lightning, atau aset lain yang didukung. Pilih bastion yang paling dekat dengan mayoritas perangkat Anda kalau Anda juga berniat menjalankan relay dari langkah 06; latensi ke relay adalah latensi di setiap koneksi yang dibawanya.

Setelah itu jalankan checklist hardening jam pertama — SSH hanya dengan kunci di port yang sudah dipindah, unattended upgrades, dan firewall default-deny. Semua langkah di bawah ini mengasumsikan mesin yang belum menjadi milik orang lain, dan mesin yang satu ini nilainya lebih tinggi dari kebanyakan: ia adalah mesin yang menentukan kunci mana yang dipercaya di setiap perangkat yang Anda miliki.

Putuskan tiga hal ini sebelum ada yang mendaftar

Setiap perangkat menanamkan ketiga hal ini ke dalam kondisinya begitu bergabung, jadi mengubah salah satunya di kemudian hari berarti mendaftarkan ulang seluruh armada secara manual. Satu: URL server kontrol — alamat HTTPS publik persis yang akan dihubungi setiap klien, lengkap dengan skema dan hostname-nya. Dua: suffix DNS tailnet, domain yang akan dijawab MagicDNS secara internal; domain ini harus salah satu yang Anda kendalikan, dan tidak boleh menjadi induk maupun anak dari hostname server kontrol itu sendiri — inilah kegagalan boot pertama yang paling sering terjadi. Tiga: rentang alamat yang dibagikan tailnet, secara konvensi blok NAT carrier-grade 100.64.0.0/10 untuk IPv4 dan /48 unique-local untuk IPv6; biarkan nilai default-nya kecuali sudah bentrok dengan jaringan yang Anda pakai.

Contoh konkret, sekaligus pola yang bisa langsung ditiru: server kontrol menjawab di vpn.example.com, suffix tailnet-nya ts.example.com, dan rentang alamatnya dibiarkan pada nilai default. Perhatikan bahwa suffix ini adalah "saudara" dari hostname kontrolnya, bukan induknya — vpn.example.com dan ts.example.com berbagi domain terdaftar yang sama, tapi yang satu tidak mengandung yang lain. Arahkan A record — dan AAAA juga kalau Anda ingin bisa dijangkau lewat IPv6 — ke mesin tersebut, dan biarkan propagasinya selesai dulu sebelum memulai, karena reverse proxy akan langsung mencoba mendapatkan sertifikat untuk nama itu begitu pertama kali menyala.

Setelah itu tulis aturan firewall-nya selagi belum ada yang mendengarkan di port mana pun. Server kontrol harus menjadi endpoint HTTPS publik karena keharusan: setiap perangkat, di jaringan mana pun, harus bisa menjangkaunya. Port UDP-nya hanya dibutuhkan kalau Anda berniat menjalankan relay sendiri di langkah 06, dan lebih mudah membukanya sekarang daripada harus men-debug ketiadaannya belakangan.

ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved
ufw allow 80/tcp                     # ACME HTTP-01 challenge
ufw allow 443/tcp                    # the control server, and DERP over HTTPS
ufw allow 3478/udp                   # STUN, only if you run your own relay
ufw enable
ufw status numbered

Pasang Docker dari repositori resminya, bukan dari paket distribusi, supaya Compose v2 tersedia dan versinya mutakhir. Setelah itu buat dua direktori yang akan menampung semua hal yang layak di-backup — satu untuk konfigurasi, satu untuk state — dan tahan godaan untuk menaruh hal lain di dalamnya.

curl -fsSL https://get.docker.com | sh
docker compose version

install -d -m 0750 /srv/headscale/config
install -d -m 0750 /srv/headscale/data
cd /srv/headscale
Langkah 03 · Deploy

Dua container dan satu file. Selalu pin versinya.

Headscale dan Caddy, tidak ada yang lain. Headscale mendengarkan di HTTP biasa di dalam jaringan Docker; Caddy yang mengakhiri TLS-nya, memperoleh sertifikat saat boot pertama, dan memperbaruinya sendiri tanpa diminta. Listener metrics tetap di localhost, karena itu permukaan debug internal, bukan permukaan publik.

Satu aturan sebelum masuk ke file-nya: pin image ke versi yang pasti. Headscale adalah perangkat lunak pre-1.0 yang sudah lebih dari sekali mengganti nama kunci konfigurasi dan subperintah CLI-nya di rilis-rilis minor. Tag yang mengambang mengubah restart container yang rutin menjadi gangguan layanan — padahal tugas layanan ini justru membuat Anda bisa menjangkau semua yang lain.

/srv/headscale/docker-compose.yml

services:
  headscale:
    image: docker.io/headscale/headscale:0.26            # pin it; never :latest
    container_name: headscale
    command: serve
    volumes:
      - ./config:/etc/headscale
      - ./data:/var/lib/headscale
    ports:
      - "3478:3478/udp"                                  # STUN, for your own DERP
    restart: unless-stopped

  caddy:
    image: caddy:2-alpine
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    restart: unless-stopped

volumes:
  caddy_data:

/srv/headscale/Caddyfile

vpn.example.com {
    reverse_proxy headscale:8080
}

Itulah keseluruhan konfigurasi proxy-nya. Caddy berbicara dalam HTTP/2 dan meng-upgrade koneksi berumur panjang tanpa perlu diperintah, dan ini penting di sini karena setiap klien menjaga satu koneksi tetap terbuka untuk menerima pembaruan peta. Ambil contoh file konfigurasi yang disertakan bersama versi yang Anda pin, lalu edit — jangan menulis dari nol; file-nya memang panjang, sebagian besar isinya default yang sudah masuk akal, dan kunci-kunci yang benar-benar penting adalah ini:

/srv/headscale/config/config.yaml — the lines that matter

server_url: https://vpn.example.com          # exactly what clients will dial
listen_addr: 0.0.0.0:8080                    # inside the Docker network only
metrics_listen_addr: 127.0.0.1:9090          # debug surface, keep it local

prefixes:
  v4: 100.64.0.0/10
  v6: fd7a:115c:a1e0::/48

noise:
  private_key_path: /var/lib/headscale/noise_private.key

database:
  type: sqlite                               # postgres for a large fleet
  sqlite:
    path: /var/lib/headscale/db.sqlite

dns:
  magic_dns: true
  base_domain: ts.example.com                # NOT a parent or child of server_url
  nameservers:
    global:
      - 1.1.1.1                              # replaced by your own in step 05

Nyalakan dulu, lalu baca log-nya — jangan menerka-nerka. Boot pertama yang gagal mendapatkan sertifikat, atau yang menolak suffix DNS karena tumpang tindih dengan hostname server, akan mengatakannya dengan jelas lalu berhenti.

docker compose up -d
docker compose logs -f headscale

# From your laptop — a control server that is up answers this:
curl -s https://vpn.example.com/health

Boot pertama membuat materi kunci privat di /srv/headscale/data. Salin ke tempat yang aman sekarang juga, sebelum satu pun perangkat mendaftar, dan sekali lagi setelah pendaftaran pertama: kehilangan kunci itu berarti semua perangkat akan menolak server yang selama ini mereka percayai, dan satu-satunya perbaikan adalah mendaftarkan ulang semuanya secara manual. Langkah 06 mengubah salinan itu menjadi backup sungguhan.

Langkah 04 · Daftarkan

Satu pengguna, satu kunci, satu klien. Lalu periksa apakah koneksinya direct.

Perintah headscale berada di dalam container, jadi setiap tindakan administratif berarti menjalankan docker exec. Buat dulu satu user — user adalah pemilik perangkat sekaligus unit yang dirujuk oleh aturan akses, jadi beri nama sesuai orang atau peran, bukan nama mesin.

hs() { docker exec -it headscale headscale "$@"; }

hs users create alice
hs users list                      # note the numeric id — newer releases want it

# A single-use key that expires in an hour is the right default.
hs preauthkeys create --user 1 --expiration 1h

Setelah itu jalankan klien resmi di perangkat tersebut, arahkan ke server Anda, bukan ke server default. Ini flag yang memang didukung resmi, bukan akal-akalan — klien-nya open source dan login server hanyalah sebuah parameter.

# On the device (Debian/Ubuntu shown; every platform has an equivalent):
curl -fsSL https://tailscale.com/install.sh | sh

sudo tailscale up \
  --login-server https://vpn.example.com \
  --auth-key <the-key-you-just-created>

tailscale status
tailscale ip -4

Tanpa kunci pra-autentikasi, klien akan mencetak sebuah URL sebagai gantinya; mengunjunginya akan menampilkan perintah registrasi untuk dijalankan di server, yang merupakan jalur interaktif dan praktis untuk perangkat yang sedang ada di depan Anda. Apa pun caranya, kerjakan dulu perangkat kedua sebelum merayakan keberhasilan — mesh yang isinya satu perangkat tidak membuktikan apa-apa. Ping perangkat itu lewat alamat tailnet-nya, lalu baca output status-nya baik-baik:

hs nodes list

# On a client, the word after the peer name is the one that matters:
tailscale status
#   100.64.0.2  laptop  alice  linux  active; direct 203.0.113.9:41641
#                                              ^^^^^^ direct, not relay

tailscale netcheck                 # why it chose what it chose

direct berarti kedua perangkat berhasil saling menemukan dan lalu lintasnya peer-to-peer. relay berarti lalu lintas itu melewati server DERP — cara ini tetap berfungsi baik, tapi menambah latensi dan menempatkan mesin ketiga di jalurnya, dan secara default mesin itu bukan milik Anda. Langkah 06 membahas cara memastikan yang mana yang sedang terjadi.

Ponsel, tablet, dan jalan memutar ala Apple

Di desktop, cukup pakai flag command-line. Di Android, opsi server kustom ada di dalam aplikasi, tersembunyi di balik nomor versi pada layar pengaturannya. Di platform Apple tidak ada kolom di dalam aplikasi sama sekali: Anda harus memasang profil konfigurasi kecil yang menentukan URL server kontrol sebelum masuk (sign in) — merepotkan sekali di awal, tapi setelah itu permanen. Dua hal yang menghemat waktu. Periksa halaman per-klien di dokumentasi Headscale daripada menebak-nebak, karena alur di Apple sudah berubah lebih dari sekali. Dan keluarkan (log out) aplikasinya dari layanan Tailscale resmi terlebih dahulu — aplikasi yang sudah memegang sesi di sana sering kali menolak server lain sampai di-logout, atau bahkan harus dipasang ulang.

Dua kebiasaan yang layak diterapkan sejak awal. Pakai kunci pra-autentikasi sekali pakai dan berumur pendek untuk manusia, dan baru pakai yang reusable atau ephemeral untuk otomatisasi yang sungguh-sungguh membutuhkannya — kunci ephemeral mendaftarkan perangkat yang menghapus dirinya sendiri begitu offline, yang pas sekali untuk CI runner dan justru keliru total untuk laptop. Dan tentukan sikap Anda soal masa berlaku kunci sekarang juga: perangkat yang terdaftar membawa tanggal kedaluwarsa, dan perangkat yang kuncinya sudah kedaluwarsa berhenti bisa dijangkau sampai seseorang meng-autentikasi ulang. Itu fitur keamanan yang bagus di laptop, tapi jadi sumber gangguan layanan di server headless jam tiga pagi. Periksa bagaimana versi Anda mengelola masa berlaku ini — subperintahnya sudah berpindah — dan atur dengan sengaja per perangkat, bukan menemukan default-nya lewat cara yang menyakitkan.

Langkah 05 · Rutekan

Diumumkan bukan berarti disetujui. Dua perintah, dua mesin.

Tailnet di mana setiap perangkat bisa menjangkau semua perangkat lain saja sudah berguna. Tiga tambahan berikut mengubahnya dari sekadar kumpulan tunnel menjadi sebuah jaringan sungguhan, dan ketiganya berbagi satu sifat yang sering menjebak orang: klien yang mengumumkan sebuah kapabilitas, tapi server yang harus menyetujuinya. Rute yang diumumkan tapi belum disetujui begitu saja dianggap tidak ada, secara senyap, dan gejalanya adalah Anda bisa ping router-nya tapi tidak ada apa pun di baliknya yang merespons.

Subnet router — menaruh seluruh LAN ke dalam tailnet. Satu mesin di jaringan rumah atau kantor mengumumkan rentang alamat jaringannya; setiap perangkat lain lalu bisa menjangkau printer, NAS, dan antarmuka manajemen di baliknya tanpa perlu memasang apa pun lagi di sana. Aktifkan dulu forwarding di kernel-nya, kalau tidak paket-paketnya akan berhenti begitu saja di router tanpa pesan error apa pun.

# On the machine that sits inside the LAN:
echo 'net.ipv4.ip_forward = 1'          | sudo tee /etc/sysctl.d/99-ts.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-ts.conf
sudo sysctl -p /etc/sysctl.d/99-ts.conf

sudo tailscale up --login-server https://vpn.example.com \
  --advertise-routes=192.168.1.0/24 --accept-routes

# On the control server — approve it, or it does not exist.
# The subcommand moved between releases; check `hs nodes --help` first.
hs nodes list
hs nodes approve-routes --identifier 3 --routes 192.168.1.0/24

Exit node — mengirim semuanya keluar lewat VPS. Mekanisme yang sama dengan rute yang lebih lebar: perangkat yang mengumumkan dirinya sebagai exit node menawarkan diri untuk membawa seluruh koneksi internet perangkat lain. Di jaringan kafe atau hotel yang tidak tepercaya, itulah persis yang Anda butuhkan, dan ini adalah hal paling mendekati VPN pribadi di seluruh panduan ini.

# On the VPS that will do the exiting (forwarding must be on, as above):
sudo tailscale up --login-server https://vpn.example.com --advertise-exit-node

# Approve it on the control server, then on the laptop:
tailscale set --exit-node=100.64.0.1 --exit-node-allow-lan-access
tailscale set --exit-node=                    # turn it off again

Exit node bukan VPN komersial, dan jangan menjualnya ke diri sendiri seolah begitu. Alamatnya hanya milik Anda seorang dan sifatnya stabil — ini sangat efektif melawan Wi-Fi kafe, tapi tidak berguna melawan korelasi jangka panjang lintas situs; trade-off ini dijelaskan lengkap di panduan utama. Perlu dicatat juga, Anda bisa menjalankan exit node di VPS kedua yang lebih murah, sehingga server kontrol tetap bebas sepenuhnya dari trafik yang diteruskan.

Aturan akses — tuliskan sebelum orang kedua bergabung. Kebijakan default-nya adalah mengizinkan semuanya, yang benar untuk tailnet seorang diri dan langsung keliru begitu ada orang lain di dalamnya. Kebijakannya berupa dokumen HuJSON kecil: kelompok user, tag untuk mesin, dan daftar aturan yang menyatakan sumber mana boleh menjangkau tujuan mana di port mana. Arahkan konfigurasi ke file itu, simpan file-nya di version control, dan reload setiap selesai mengedit.

{
  "groups": {
    "group:admin":     ["alice"],
    "group:contractor":["bob"]
  },
  "tagOwners": {
    "tag:server": ["group:admin"],
    "tag:exit":   ["group:admin"]
  },
  "acls": [
    // Admins reach everything.
    { "action": "accept", "src": ["group:admin"], "dst": ["*:*"] },

    // The contractor reaches one machine, on two ports, and nothing else.
    { "action": "accept", "src": ["group:contractor"],
      "dst": ["tag:server:22,443"] }
  ],
  "autoApprovers": {
    "routes":   { "192.168.1.0/24": ["tag:server"] },
    "exitNode": ["tag:exit"]
  }
}

Dua catatan soal file itu. Bahasa kebijakannya berasal dari Tailscale, dan Headscale mengimplementasikan sebagian besar darinya — dan terus bertambah — bukan seluruhnya, jadi periksa dokumentasi versi Anda sebelum mengandalkan aturan yang eksotis. Dan lokasi kebijakannya sendiri sudah berpindah: rilis lama menyebutkan sebuah path di konfigurasi tingkat atas, rilis baru mengelompokkannya di bawah bagian policy dengan mode yang juga bisa menyimpan aturannya di database. Keduanya terdokumentasi; yang penting adalah yang sesuai dengan versi yang Anda pin.

MagicDNS — nama pendek, dan resolver Anda sendiri di mana pun. Dengan MagicDNS aktif, setiap perangkat menjawab ke nama pendek di dalam suffix yang Anda pilih di langkah 02, jadi ssh nas berfungsi dari mana saja tanpa perlu hosts file. Bagian keduanya yang lebih menarik: server kontrol juga mendorong daftar nameserver ke setiap klien, yang berarti resolver yang Anda bangun di panduan resolver DNS privat kami bisa melayani ponsel Anda di jaringan seluler — dengan filtering, dengan cache, dan tanpa mencatat log apa pun — sambil tetap hanya mendengarkan di alamat tailnet yang sama sekali tidak bisa dijangkau dari internet.

dns:
  magic_dns: true
  base_domain: ts.example.com
  override_local_dns: true          # beat whatever DHCP handed the device
  nameservers:
    global:
      - 100.64.0.5                  # your resolver, on the tailnet
Langkah 06 · Jaga

Relay Anda sendiri, backup Anda sendiri. Dan upgrade yang dibaca dulu sebelum diterapkan.

Relay yang Anda lupa sedang Anda pakai. Kalau dua perangkat tidak bisa membuka koneksi langsung — NAT simetris di kedua ujung, firewall yang memakan UDP, operator seluler yang melakukan sesuatu yang "kreatif" — trafiknya jatuh ke relay DERP. Trafik itu tetap terenkripsi end-to-end, jadi relay hanya membawa ciphertext. Yang dilihat relay adalah siapa berbicara dengan siapa, seberapa banyak, dan kapan. Secara default, Headscale memberi klien Anda peta relay publik, dan relay-relay itu dioperasikan oleh perusahaan yang justru sedang Anda tinggalkan. Headscale menyertakan relay tertanam; mengaktifkannya menaruh jalur cadangan itu di datacenter Nordik yang sama dengan semua yang lain di sini.

derp:
  server:
    enabled: true
    region_id: 999                  # custom regions live in the 900s
    region_code: "nb-hel"
    region_name: "Helsinki (self-hosted)"
    stun_listen_addr: "0.0.0.0:3478"
  urls:
    - https://controlplane.tailscale.com/derpmap/default   # remove for yours only
  auto_update_enabled: true
  update_frequency: 24h

Membiarkan peta relay publik tetap ada berdampingan dengan wilayah Anda sendiri adalah pilihan default yang pragmatis: klien akan lebih memilih relay mana pun yang paling dekat, jadi perangkat di belahan bumi yang sama mendapat relay Anda, sementara perangkat di ujung dunia lain tidak terjebak hanya mengandalkan satu hop Nordik. Menghapus URL publiknya membuat tailnet benar-benar mandiri, dengan konsekuensi fallback yang lebih buruk untuk perangkat yang jauh. Keduanya sama-sama masuk akal; pilih dengan sadar, jangan karena lupa memutuskan.

Empat file, di luar lokasi, terenkripsi. Backup-nya kecil sampai-sampai memalukan kalau sampai hilang: database, materi kunci privat, file konfigurasi, dan file kebijakan. Digabung, semuanya cuma galat pembulatan pada tagihan storage mana pun, dan tanpa materi kuncinya, setiap perangkat di jaringan akan menolak server. Kirim ke tempat lain, bukan mesin ini — idealnya di yurisdiksi kedua, yang justru dibahas panduan backup kami — dan pulihkan sekali ke VPS percobaan dengan sengaja, sebelum Anda benar-benar membutuhkannya.

# Stop briefly for a consistent SQLite copy, or use .backup on a live db.
docker compose stop headscale
tar czf /tmp/headscale-$(date +%F).tar.gz -C /srv/headscale config data
docker compose start headscale

restic -r sftp:backup@backup.example.com:/srv/restic backup \
       /tmp/headscale-$(date +%F).tar.gz

Upgrade, yang justru menjadi risiko sesungguhnya. Ini adalah perangkat lunak pre-1.0 dan perilakunya memang begitu: kunci konfigurasi sudah berganti nama, subperintah CLI sudah berpindah, dan sebuah rilis lebih dari sekali membutuhkan migrasi terdokumentasi, bukan sekadar restart. Semua itu bukan alasan untuk menghindarinya — itu alasan untuk punya rutinitas yang jelas. Baca catatan rilis sebelum menarik image barunya. Ambil dulu arsip di atas. Bandingkan (diff) file konfigurasi Anda dengan contoh yang disertakan versi baru itu, karena di situlah kunci yang berganti nama akan mengumumkan dirinya sendiri. Naikkan satu versi minor setiap kali, jangan langsung tiga. Dan simpan catatan tag image lama, karena rollback yang bisa Anda lakukan dalam tiga puluh detik itulah yang membuat semuanya terasa rendah risiko.

Setelah itu, pasang pengingat bulanan untuk memeriksa dua hal: daftar perangkat terdaftar, supaya mesin yang sudah Anda pensiunkan enam bulan lalu berhenti menjadi anggota, dan tanggal kedaluwarsanya, supaya tidak ada yang diam-diam lepas di saat yang buruk. VPN mesh adalah salah satu dari sedikit layanan yang gagal secara senyap — semuanya tetap berjalan sampai suatu saat Anda justru membutuhkan perangkat yang ternyata sudah diam-diam kedaluwarsa.

Bagian yang jujur · Apa yang tidak dilakukan ini

Anda mengambil kembali peta itu. Anda tidak lantas menjadi tak terlihat.

Meng-hosting-sendiri control plane adalah perbaikan yang nyata dan spesifik, dan ini bukan sulap yang membuat masalah menghilang begitu saja. Lima hal berikut tetap benar setelah semua langkah di atas selesai dikerjakan, dan mengetahuinya adalah beda antara pertahanan sungguhan dan sekadar cerita yang menenangkan.

Server kontrol adalah endpoint publik yang punya nama. Setiap perangkat menghubunginya, jadi ia butuh hostname, dan hostname itu langsung tercatat di log certificate-transparency begitu sertifikatnya diterbitkan. Alamat ini tetap bisa ditemukan meski Anda tidak pernah menautkannya ke mana pun, dan alamat itulah satu-satunya hal konstan yang dimiliki bersama oleh semua perangkat Anda. Pakai subdomain dari nama yang sudah Anda publikasikan, bukan nama yang justru menjelaskan fungsinya.

Headscale adalah sebuah reimplementasi, dan ia mengatakannya secara terbuka. Headscale tidak dibangun maupun didukung oleh Tailscale, kesetaraan fiturnya memang sengaja dibuat sebagian saja, dan sebagian dari apa yang dijual produk hosted-nya — konsol web, armada relay publik, jalur single sign-on yang mulus — sama sekali tidak ada di sini, atau hanya tersedia sebagai proyek pihak ketiga yang belum pernah diaudit siapa pun. Baca dokumentasi proyeknya untuk memastikan sebuah fitur benar-benar ada sebelum Anda menyusun rencana di atasnya, dan perlakukan upgrade sebagai tugas yang harus dikerjakan, bukan proses yang berjalan begitu saja di latar belakang.

Relay default-nya tetap milik orang lain. Sebelum Anda mengaktifkan server DERP tertanam, koneksi yang tidak bisa direct akan jatuh ke armada relay publik. Payload-nya tetap terenkripsi end-to-end dan tidak ada yang bisa membacanya — tapi fakta bahwa dua perangkat Anda sedang saling berbicara, dan seberapa banyak, tetap melintasi infrastruktur yang bukan milik Anda. Itulah bagian dari rantai kepercayaan yang paling sering terlewat oleh kebanyakan orang di sore pertama mereka mencobanya.

Exit node adalah alamat yang stabil, bukan keramaian. Merutekan trafik Anda lewat VPS sendiri mengalahkan pengawasan jaringan kafe dan profil ISP. Tapi ini tidak mengalahkan korelasi, karena alamat itu hanya milik Anda seorang dan tidak pernah berubah. Alamat bersama milik VPN komersial justru lebih buruk dalam segala hal, kecuali satu hal yang paling penting untuk ancaman spesifik itu.

Mesinnya tetap berada di sebuah gedung. Server sewaan tetap berjalan di atas perangkat keras di sebuah datacenter yang punya pintu dan staf. Yang berubah adalah tidak ada lagi indeks tingkat produk yang mencatat perangkat Anda, tidak ada database perusahaan yang merekam dari mana masing-masing tersambung, dan tidak ada kebijakan privasi yang bisa diubah begitu saja kuartal depan. Yang tidak berubah: disknya tetap fisik, dan tetap tidak berada di rumah Anda.

Apa yang sebenarnya Anda beli, secara tepat: daftar setiap mesin yang Anda miliki, catatan dari mana masing-masing terhubung, dan wewenang untuk menambahkan mesin baru, semuanya sekarang dipegang oleh mesin yang Anda sewa tanpa nama tertentu. Itu klaim yang sempit, tapi nyata. Nilainya baru sepadan dengan biayanya kalau langkah 06 benar-benar dikerjakan — control plane self-hosted tanpa uji pemulihan bukanlah peningkatan privasi, melainkan sekadar single point of failure dengan branding yang lebih bagus.

Ukuran · Apa yang perlu dipesan

Control plane-nya gratis. Trafiknya yang Anda bayar.

Tingkatan Bulanan Sumber daya Apa yang bisa dijalankannya dengan nyaman
Sentinel$3.902 vCPU · 4 GB · 120 GB · 1 GbpsServer kontrol, satu relay, dan pemakaian exit node yang ringan. Titik awal yang tepat.
Sentinel kedua$3.90Exit node, di mesinnya sendiriMenjauhkan trafik yang diteruskan dari control plane
Ravelin$16.908 vCPU · 16 GB · 480 GB · 2.5 GbpsExit node harian untuk satu rumah tangga, dengan kecepatan penuh
Bulwark$32.9016 vCPU · 32 GB · 960 GB · 5 GbpsExit node milik perusahaan dan relay yang sibuk, sekaligus

Tidak ada satu pun di tabel ini yang ukurannya ditentukan oleh kebutuhan koordinasi. Server kontrol hanya menyimpan satu koneksi idle per perangkat dan database yang ukurannya diukur dalam kilobyte; beberapa ratus perangkat pun tidak akan membebani tingkatan terkecil sekalipun. Yang benar-benar menghabiskan sumber daya mesin adalah trafik yang diteruskan — koneksi yang di-relay, dan jauh lebih besar lagi, exit node yang membawa seluruh koneksi internet orang lain. Sesuaikan ukurannya dengan uplink dan throughput enkripsinya, dan ingat bahwa bandwidth tidak dibatasi di semua tingkatan, jadi satu-satunya pertanyaan yang tersisa adalah seberapa cepat yang Anda inginkan.

Catatan lapangan · Enam jebakan

Enam cara ini bisa jadi berantakan. Dua di antaranya terlihat seperti masalah DNS.

Jebakan 01 · Membingungkan

Suffix tailnet tumpang tindih dengan hostname server

Memilih suffix MagicDNS yang merupakan induk atau anak dari hostname server kontrol itu sendiri akan merusak resolusi nama dengan cara yang terlihat seperti gangguan DNS biasa. Jaga keduanya tetap sebagai "saudara": vpn.example.com untuk server, ts.example.com untuk tailnet.

Jebakan 02 · Senyap

Rute yang diumumkan tapi tak pernah disetujui

Klien dengan santainya melaporkan bahwa ia sedang mengumumkan 192.168.1.0/24, tapi tidak ada apa pun di balik router yang merespons, karena server tidak pernah menyetujuinya. Tidak ada pesan error di mana pun. Setujui dulu di sisi server, lalu periksa daftar rute-nya, bukan di sisi klien.

Jebakan 03 · Lambat

Semuanya di-relay, tidak ada yang direct

Jaringan yang memblokir UDP keluar memaksa setiap koneksi melewati relay: tetap bisa jalan, tapi lebih lambat, dan menaruh mesin ketiga di jalurnya. tailscale status akan menampilkan relay, bukan direct, dan netcheck menjelaskan sebabnya. Perbaiki firewall-nya, atau terima tambahan loncatan itu dengan sadar.

Jebakan 04 · Terekspos

Kebijakan default yang mengizinkan semuanya, dengan seorang tamu di tailnet

Tailnet yang baru dibuat membiarkan setiap perangkat menjangkau semua perangkat lain di semua port. Itu benar untuk satu orang, dan langsung keliru begitu laptop seorang kontraktor bergabung — termasuk ke antarmuka manajemen yang bahkan tidak mereka sadari keberadaannya. Tulis kebijakannya sebelum mengirim undangan.

Jebakan 05 · Fatal

Kunci privat yang tak pernah di-backup

Bangun ulang mesinnya, pulihkan database-nya, tapi lupa materi kuncinya — dan semua perangkat langsung menolak server yang kemarin masih mereka percayai. Tidak ada pemulihan cerdik untuk ini; yang ada hanya satu hari penuh mendaftarkan ulang ponsel-ponsel secara manual. Salin direktori data-nya sebelum perangkat pertama bergabung.

Jebakan 06 · Terhindarkan

Tag image yang mengambang pada layanan pre-1.0

Kunci konfigurasi dan subperintah CLI sudah berganti nama di beberapa rilis minor. Dengan tag :latest, restart yang sama sekali tidak berhubungan bisa menarik versi baru dan menghentikan control plane untuk seluruh armada perangkat Anda. Pin tag-nya, baca catatan rilisnya, dan upgrade dengan sengaja.

FAQ · VPN mesh self-hosted

Pertanyaan, dijawab.

Sebelas pertanyaan yang muncul selagi membangun ini — dimulai dari dua pertanyaan yang menentukan apakah Anda sebaiknya membangunnya sama sekali.

Apakah Headscale produk resmi Tailscale?

Bukan, dan penting untuk memahami dengan tepat apa artinya. Headscale adalah reimplementasi independen dan open-source dari server koordinasi — komponen Tailscale yang mendistribusikan kunci publik, endpoint, dan kebijakan. Ia tidak dibangun, dijual, maupun didukung oleh Tailscale, tidak membawa kontrak dukungan komersial, dan kalau ada yang rusak, Anda akan membaca issue tracker, bukan membuka tiket dukungan. Yang dilakukannya adalah berbicara dalam protokol yang sama dengan yang sudah digunakan klien resmi Tailscale yang open-source, itulah sebabnya klien tersebut berfungsi tanpa modifikasi terhadapnya. Ada dua konsekuensi praktis dari sini. Kesetaraan fiturnya bersifat sebagian dan akan selalu begitu, karena proyek ini mengejar target yang terus bergerak dan dirawat oleh tim yang jauh lebih besar — periksa dokumentasi proyeknya sendiri untuk memastikan sebuah fitur benar-benar ada sebelum Anda merancang sesuatu di atasnya. Dan upgrade butuh perhatian lebih dibanding sekadar menaikkan versi container biasa: skema konfigurasi dan beberapa subperintah CLI-nya sudah berganti nama di berbagai rilis minor, dan itulah penyebab paling umum orang merusak instalasi yang tadinya berjalan baik.

Bisakah server koordinasi membaca trafik saya?

Tidak — dan bagian arsitektur inilah yang layak dipahami, bukan sekadar dipercaya begitu saja. Setiap perangkat membuat pasangan kunci WireGuard-nya sendiri secara lokal, dan bagian privatnya tidak pernah meninggalkan perangkat itu. Yang diunggah sebuah perangkat ke server kontrol hanyalah kunci publik-nya, endpoint-nya saat ini, dan sedikit metadata; yang diunduhnya adalah hal yang sama untuk setiap perangkat lain yang boleh dijangkaunya. Tunnel-nya kemudian dinegosiasikan langsung antar-perangkat, dan enkripsinya adalah WireGuard biasa antara dua kunci yang tidak pernah dipegang server. Jadi server kontrol tidak bisa mendekripsi apa pun, dan itu juga berlaku untuk server milik Tailscale. Yang bisa dilakukannya justru hal lain yang lebih jarang dibicarakan: ia memegang peta. Nama perangkat, nama pengguna, kunci publik, IP publik tempat masing-masing perangkat sedang terhubung saat ini, perangkat mana yang menyala jam 3 pagi, dan kebijakan yang menentukan siapa boleh menjangkau siapa. Server itu juga yang mendistribusikan kunci, jadi server kontrol yang diretas atau dipaksa bisa menambahkan sebuah perangkat ke jaringan Anda. Self-hosting tidak menyelesaikan soal matematika; ia hanya memindahkan soal administratif itu ke mesin yang Anda miliki sendiri.

Apa yang terjadi pada jaringan saya kalau server kontrol mati?

Jauh lebih sedikit daripada yang orang kira, dan itulah bagian yang melegakan dari desain ini. Perangkat menyimpan cache peta jaringan terakhir yang mereka terima, dan tunnel WireGuard yang sudah terbentuk sifatnya peer-to-peer — tidak melewati server kontrol dan tidak butuh server itu untuk terus berjalan. Reboot VPS di tengah hari kerja biasa biasanya bahkan tidak terasa. Yang berhenti adalah perubahan: tidak ada perangkat baru yang bisa mendaftar, perangkat yang berpindah ke jaringan baru mungkin butuh waktu lebih lama untuk menemukan lagi peer-nya, perubahan kebijakan tidak tersebar, dan node mana pun yang kuncinya kedaluwarsa saat server sedang mati tidak akan bisa memperbaruinya. Jadi cara yang tepat untuk memandang server kontrol adalah sebagai control plane, bukan sebagai jalur data: gangguan padanya adalah ketidaknyamanan, bukan pemutusan koneksi. Meski begitu, perlakukan tetap sebagai layanan produksi. Backup secara rutin (langkah 06), dan kalau seluruh departemen bergantung pada tailnet ini, taruh server kontrol di mesin kecilnya sendiri, jangan digabung dengan sesuatu yang sering di-restart.

Headscale atau WireGuard biasa — kapan control plane sungguh sepadan?

Hitung dulu jumlah perangkat Anda, dan hitung berapa banyak di antaranya yang berpindah-pindah. WireGuard biasa adalah jawaban yang sangat baik untuk kumpulan perangkat kecil dan statis: tiga atau empat peer, endpoint tetap, satu file konfigurasi masing-masing, tidak ada yang perlu dijalankan selain modul kernelnya. Ini lebih sedikit perangkat lunaknya, lebih kecil permukaan serangannya, dan lebih ringan perawatannya dibanding apa pun di panduan ini, dan panduan WireGuard kami membahasnya tuntas dari awal sampai akhir. Konsekuensinya, WireGuard sengaja tidak punya mekanisme distribusi kunci, jadi setiap perangkat baru berarti mengedit semua perangkat lain — pekerjaan yang tumbuh sebanding kuadrat jumlah armada Anda — dan klien yang berpindah-pindah di Wi-Fi hotel atau data seluler butuh seseorang yang terus memberi tahu semua pihak ke mana mereka pindah. Control plane adalah hal yang membeli Anda kemudahan itu. Ambang batasnya dalam praktik ada di sekitar lima perangkat, atau begitu laptop pertama berpindah jaringan setiap hari, atau begitu Anda pertama kali menginginkan aturan seperti "laptop kontraktor hanya bisa menjangkau staging server dan tidak ada yang lain". Di bawah itu, pakai saja WireGuard dan nikmati ketenangannya.

Apakah aplikasi Tailscale di ponsel saya bisa dipakai dengan Headscale?

Ya — ini klien resmi yang sama, dan mengarahkannya ke server kontrol yang berbeda adalah operasi yang memang didukung resmi, bukan akal-akalan. Mekanismenya berbeda-beda tergantung platform, dan di situlah orang bisa menghabiskan satu malam penuh. Di Linux, macOS, dan Windows, cukup pakai flag command-line pada klien (--login-server) atau pengaturan setaranya. Di Android, opsinya ada di dalam aplikasi itu sendiri, tersembunyi di balik nomor versi pada layar pengaturan. Di iOS, iPadOS, dan tvOS tidak ada kolom di dalam aplikasi sama sekali: Anda harus memasang profil konfigurasi kecil yang menentukan URL server kontrol sebelum sign in, yang merepotkan di kali pertama tapi setelah itu permanen. Dokumentasi Headscale menyediakan halaman khusus per platform untuk urusan ini, dan lebih baik dibuka daripada menebak-nebak, karena alur di Apple khususnya sudah berubah lebih dari sekali. Satu catatan yang tidak spesifik ke platform mana pun: aplikasi yang sudah pernah sign in ke layanan Tailscale resmi biasanya perlu di-logout terlebih dahulu — dan kadang harus dipasang ulang — sebelum ia mau menerima server yang berbeda.

Apakah saya perlu menjalankan relay DERP sendiri?

Bukan untuk membuat jaringannya berfungsi — tapi inilah bedanya antara "kebanyakan privat" dengan "konsisten privat", jadi putuskan dengan sengaja. Server DERP adalah relay yang dipakai saat dua perangkat tidak bisa membuka koneksi langsung: NAT simetris di kedua ujung, firewall korporat yang memakan UDP, atau operator seluler yang melakukan sesuatu yang "kreatif". Trafik yang di-relay tetap terenkripsi end-to-end lewat WireGuard, jadi operator relay hanya melihat ciphertext, bukan isinya. Yang mereka lihat adalah metadata: dua perangkat mana yang sedang berbicara, seberapa banyak, dan kapan. Secara default, Headscale memberi perangkat Anda peta DERP publik milik Tailscale, yang berarti relay-relay itu tetap milik Tailscale — Anda sudah meng-hosting-sendiri control plane-nya, tapi meninggalkan jalur data cadangannya di tangan perusahaan yang justru sedang Anda tinggalkan. Headscale menyertakan server DERP tertanam; mengaktifkannya memberi Anda relay sendiri di datacenter Nordik yang sama dengan server kontrolnya. Trade-off yang jujur di sini adalah jangkauan: Tailscale menjalankan relay di beberapa benua, sementara Anda hanya menjalankan satu, jadi perangkat yang berada di sisi dunia yang salah akan lebih terlayani oleh relay mereka. Menjalankan keduanya sekaligus, dengan relay Anda tetap ada di petanya, adalah jalan tengah yang sangat masuk akal.

Bisakah seluruh tailnet memakai resolver DNS saya sendiri?

Ya, dan ini salah satu alasan terbaik untuk membangun semua ini. Headscale bisa mendorong konfigurasi DNS ke setiap perangkat yang bergabung, jadi laptop Anda di Wi-Fi kafe dan ponsel Anda di jaringan seluler sama-sama melakukan resolusi lewat resolver yang Anda jalankan sendiri — dengan filtering, dengan cache, dan tanpa jaringan lokal melihat query-nya sama sekali. Arahkan nameserver global tailnet ke IP tailnet dari mesin yang menjalankan Unbound atau AdGuard Home Anda sendiri, dan atur override-nya supaya menang melawan apa pun yang diberikan DHCP ke perangkat. Ada dua hal yang harus benar. Resolver-nya harus bisa dijangkau di dalam tailnet, bukan di internet publik — itulah inti dari semuanya, dan itu juga berarti Anda akhirnya bisa menutup port 53 dari dunia luar. Dan MagicDNS, yang memberi setiap perangkat nama pendek di dalam suffix pilihan Anda, mengharuskan suffix itu adalah salah satu yang Anda kendalikan dan bukan induk maupun anak dari hostname server kontrol itu sendiri; salah di bagian ini menghasilkan kegagalan yang membingungkan, terlihat seperti bug DNS padahal sebenarnya bug konfigurasi.

Seberapa besar VPS yang dibutuhkan?

Untuk control plane saja: kecil, dan bahkan lebih kecil dari itu. Headscale adalah satu binary Go yang menyimpan database kecil berisi perangkat, kunci, dan kebijakan; trafik koordinasinya hanya rintik-rintik koneksi long-poll, satu per perangkat, yang hampir sepanjang waktu tidak membawa apa-apa. Satu Sentinel — 2 vCPU, 4 GB, 120 GB NVMe, $3.90 sebulan — sanggup melayani satu rumah tangga, perusahaan kecil, atau beberapa ratus perangkat tanpa terasa bebannya. Pertanyaan soal ukuran baru menjadi menarik saat mesin yang sama mengambil peran kedua. Relay DERP tertanam meneruskan trafik sungguhan, jadi ia butuh uplink, bukan core tambahan. Exit node meneruskan seluruh trafik sebuah perangkat, jadi ia butuh uplink, alokasi bandwidth yang lega, dan CPU yang sanggup mengimbangi enkripsi pada kecepatan penuh. Kalau Anda berencana memakai keduanya, sesuaikan ukuran mesin dengan trafiknya dan anggap server kontrol sebagai galat pembulatan semata — atau lebih baik lagi, taruh exit node di mesin kedua dan biarkan control plane-nya tetap membosankan.

Apakah exit node di VPS saya sendiri sama saja dengan memakai VPN komersial?

Secara teknis mirip, tapi dari segi privasi hampir berkebalikan, jadi ada baiknya bersikap jernih soal ini. Exit node merutekan seluruh koneksi internet sebuah perangkat lewat VPS Anda, sehingga situs web melihat alamat VPS itu, bukan alamat rumah atau hotel Anda, dan jaringan lokal hanya melihat satu tunnel terenkripsi, bukan aktivitas browsing Anda. Sejauh ini sama seperti VPN komersial. Bedanya ada pada keramaiannya. Alamat VPN komersial dipakai bersama oleh ribuan pelanggan yang tidak saling berhubungan, dan justru itulah yang membuat trafik sulit diatribusikan ke Anda; alamat exit node Anda hanya dipakai oleh Anda, secara stabil, selamanya. Melawan jaringan kafe yang mengintai atau ISP yang menyusun profil, exit node ini sangat unggul. Melawan pengamat yang mengorelasikan aktivitas lintas situs selama berbulan-bulan, alamat khusus justru menjadi penanda identitas yang tahan lama, sementara alamat bersama tidak. Pakai exit node untuk hal yang memang jadi kelebihannya — jaringan lokal yang tidak tepercaya, menjangkau layanan Anda sendiri, alamat stabil untuk hal-hal yang membutuhkannya — dan baca panduan utama kami untuk bagian model ancaman yang tidak dicakupnya.

Apa saja sebenarnya yang harus saya backup?

Empat hal, dan hanya satu yang terasa jelas. Database-nya — SQLite secara default, atau PostgreSQL kalau Anda memindahkannya — menyimpan user, perangkat, kunci publik, rute, dan kunci pra-autentikasi. Materi kunci privat yang dibuat saat boot pertama adalah bagian yang sering dilupakan orang: kehilangannya berarti semua perangkat menolak server yang sudah mereka ajak bicara selama setahun, yang berarti mendaftarkan ulang seluruh armada secara manual. File konfigurasi juga penting karena menyimpan tiga nama dari langkah 02, dan mencoba merekonstruksinya dari ingatan adalah cara orang tanpa sadar mengubah salah satunya. Dan file kebijakan, kalau Anda menyimpan aturan akses di disk, adalah hal yang paling tidak ingin Anda tulis ulang. Keempatnya berada di dua direktori dan bobotnya bersama-sama lebih ringan dari sebuah foto. Enkripsi semuanya, kirim ke mesin lain — idealnya di yurisdiksi yang berbeda, yang justru menjadi topik panduan backup kami — dan pulihkan sekali ke VPS percobaan dengan sengaja, supaya Anda tahu file yang Anda simpan memang file yang Anda butuhkan.

Apakah NordBastion keberatan jika saya menjalankan server kontrol dan exit node di satu VPS?

Server kontrol adalah beban kerja yang biasa dan berperilaku baik — sedikit HTTPS, sedikit UDP, nyaris tanpa trafik — dan tidak ada satu pun dalam kebijakan penggunaan wajar yang menyinggungnya. Exit node layak dipikirkan satu kalimat saja, bukan ceramah kebijakan panjang lebar: semua yang dikirim perangkat lewat exit node itu keluar ke internet dari alamat VPS Anda, atas nama akun Anda, jadi apa pun yang dilakukan perangkat Anda itulah yang akan melekat pada alamat tersebut. Itu wajar dan memang untuk itulah fitur ini ada; itu juga sebabnya membagikan exit node ke orang yang tidak Anda kenal adalah ide buruk, sama seperti open relay. Bandwidth tidak dibatasi di semua tingkatan dan trafik yang di-relay adalah trafik biasa, jadi server DERP dan exit node sama-sama termasuk dalam paket, bukan dihitung terpisah. Selain itu: akun tidak perlu memakai nama Anda, tagihan bisa dilunasi dengan Monero atau Bitcoin, dan mesin yang menyimpan peta seluruh perangkat Anda tidak diindeks oleh siapa pun.

Dapatkan mesinnya

Control plane milik Anda sendiri, di akun yang bukan atas nama Anda. Tanpa KYC, dibayar dengan kripto.

Sentinel — 2 vCPU dan 4 GB dengan $3.90 sebulan, di Helsinki, Stockholm, Oslo, atau Reykjavík. Cukup untuk Headscale, Caddy, dan relay DERP Anda sendiri, dengan ruang tersisa untuk exit node kalau Anda ingin menaruhnya di mesin yang sama. Tanpa email saat mendaftar, tanpa dokumen identitas, dan tanpa database perusahaan yang menyimpan daftar setiap perangkat yang Anda miliki.

Terakhir ditinjau · 2026-10-12 · Sumber · Dokumentasi Headscale (referensi konfigurasi, pengaturan klien, ACL, DERP, CLI jarak jauh), dokumentasi klien Tailscale dan exit node, paper protokol WireGuard, dokumentasi Caddy · Kadence · tahunan

Hosting privat, dibangun di Utara.