NoctisNode
← PanduanJaringan2026-10-239 menit

Membangun Cluster VPS Privat dengan Mesh WireGuard

Hubungkan node VPS menjadi cluster privat dengan full mesh WireGuard: satu rencana alamat, satu [Peer] per node, AllowedIPs /32, firewall ketat, dan layanan yang di-bind ke wg0.

Singkatnya: untuk mengubah beberapa VPS menjadi cluster privat, beri setiap node VPS interface WireGuard dengan alamat dari satu subnet privat, tambahkan setiap node lain sebagai `[Peer]` dengan `Endpoint` publiknya dan `/32` di `AllowedIPs`, izinkan UDP 51820 hanya dari node Anda sendiri, dan bind database serta layanan internal ke alamat `wg0` alih-alih IP publik. Hingga sekitar sepuluh node, cara ini mudah dipelihara secara manual atau dengan template; lebih dari itu, gunakan tool yang membuat dan mendistribusikan konfigurasi.

Panduan ini mengasumsikan Anda sudah memahami dasar-dasar dari panduan VPN WireGuard dan sudah memperkuat SSH di setiap node seperti di panduan hardening SSH; untuk menjangkau node melalui bastion tanpa agent forwarding, lihat panduan StrictModes dan agent forwarding.

Rencana alamat untuk node VPN

Pilih satu rentang privat yang tidak bertabrakan dengan apa pun yang Anda pakai (LAN rumah, Docker, rentang pod Kubernetes). `/24` sudah cukup untuk cluster kecil dan membuat alamat mudah dibaca. Tetapkan alamat tetap untuk setiap node dan simpan rencananya di version control, karena setiap konfigurasi diturunkan dari situ.

NodePeranIP publikAlamat wg0ListenPort
node1app203.0.113.1110.88.0.1/2451820
node2app203.0.113.1210.88.0.2/2451820
node3database203.0.113.1310.88.0.3/2451820
node4monitoring203.0.113.1410.88.0.4/2451820

Konfigurasi per peer di setiap node VPS

Dalam full mesh, setiap node berkomunikasi langsung dengan setiap node lain, sehingga setiap konfigurasi memiliki satu `[Interface]` dan N-1 bagian `[Peer]`. Empat node berarti total enam tunnel; sepuluh node berarti 45. Setiap node punya IP publik, jadi `PersistentKeepalive` biasanya tidak diperlukan; detailnya ada di panduan keepalive dan PresharedKey.

  1. 01.Di setiap node jalankan `apt install wireguard`, lalu `umask 077; wg genkey | tee /etc/wireguard/wg0.key | wg pubkey > /etc/wireguard/wg0.pub`.
  2. 02.Kumpulkan semua kunci publik dan rencana alamat di satu tempat.
  3. 03.Opsional: buat satu kunci `wg genpsk` per pasangan node sebagai lindung nilai pasca-kuantum.
  4. 04.Tulis `/etc/wireguard/wg0.conf` di setiap node seperti ditunjukkan di bawah.
  5. 05.Jalankan `systemctl enable --now wg-quick@wg0` dan periksa `wg show` untuk handshake terbaru dengan setiap peer.
# /etc/wireguard/wg0.conf on node1
[Interface]
Address = 10.88.0.1/24
ListenPort = 51820
PrivateKey = <node1 private key>

[Peer]
# node2
PublicKey = <node2 public key>
Endpoint = 203.0.113.12:51820
AllowedIPs = 10.88.0.2/32

[Peer]
# node3
PublicKey = <node3 public key>
Endpoint = 203.0.113.13:51820
AllowedIPs = 10.88.0.3/32

[Peer]
# node4
PublicKey = <node4 public key>
Endpoint = 203.0.113.14:51820
AllowedIPs = 10.88.0.4/32

Cara kerja AllowedIPs dalam mesh

`AllowedIPs` menjalankan dua tugas sekaligus. Untuk arah keluar, ia adalah tabel routing: paket untuk `10.88.0.3` dikirim ke peer yang mencantumkan `10.88.0.3/32`. Untuk arah masuk, ia adalah daftar akses: paket yang datang dari peer itu hanya diterima jika alamat sumbernya berada di dalam `AllowedIPs` peer tersebut. Itulah sebabnya setiap peer mendapat tepat `/32` miliknya sendiri, bukan seluruh `/24`.

`/24` di baris `Address` hanya membuat route kernel untuk subnet di `wg0`; WireGuard kemudian memilih peer yang tepat per tujuan.

  • ▹Dua peer tidak boleh berbagi rentang `AllowedIPs` yang tumpang tindih di interface yang sama; yang terakhir yang berlaku.
  • ▹Jika sebuah node juga merutekan subnet privat (misalnya Docker di node3), tambahkan subnet itu ke `AllowedIPs` node3 di node-node lain.
  • ▹Jangan taruh `0.0.0.0/0` di peer mesh kecuali Anda memang ingin semua trafik keluar melalui node tersebut.

Firewall: hanya node Anda yang bisa menjangkau tunnel

WireGuard tidak menjawab paket yang tidak terautentikasi, tetapi membatasi UDP 51820 hanya untuk IP node yang dikenal tetap mengurangi gangguan. Di dalam tunnel, buka hanya port yang dibutuhkan setiap layanan. Contoh nftables untuk Debian 12/13 dan Ubuntu 24.04 ini ditaruh di `/etc/nftables.conf`; muat dengan `nft -f /etc/nftables.conf` dan aktifkan `nftables.service`. Biarkan sesi SSH tetap terbuka saat menguji.

table inet filter {
  set mesh_peers {
    type ipv4_addr
    elements = { 203.0.113.11, 203.0.113.12, 203.0.113.13, 203.0.113.14 }
  }
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    iif lo accept
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport 22 accept
    udp dport 51820 ip saddr @mesh_peers accept
    iifname "wg0" ip saddr 10.88.0.0/24 tcp dport { 5432, 6379, 9100 } accept
  }
}

Bind layanan ke interface wg

Firewall adalah satu lapisan; lapisan kedua adalah sama sekali tidak listen di alamat publik. Bind layanan internal ke alamat `wg0` node agar kesalahan firewall tidak mengeksposnya. Karena `wg0` harus sudah ada sebelum layanan melakukan bind, atur urutan unit dengan drop-in systemd, atau izinkan bind ke alamat yang belum aktif dengan `net.ipv4.ip_nonlocal_bind = 1`.

# PostgreSQL on node3: postgresql.conf
listen_addresses = '10.88.0.3'
# pg_hba.conf
host  all  all  10.88.0.0/24  scram-sha-256

# Redis: /etc/redis/redis.conf
bind 10.88.0.3

# systemctl edit postgresql  (repeat for other services)
[Unit]
[email protected]
[email protected]

Note · Periksa hasilnya dengan `ss -tlnp`: layanan internal harus menampilkan `10.88.0.x`, tidak pernah `0.0.0.0` atau IP publik.

Penskalaan: kapan beralih ke tooling

Mesh yang ditulis manual tidak masalah selama jumlah node sedikit dan perubahan jarang. Setiap node baru berarti mengedit setiap konfigurasi yang ada, sehingga pekerjaannya bertambah secara kuadratik. Begitu itu menjadi beban, buat konfigurasi secara otomatis alih-alih menulisnya.

Di NoctisNode, semua node VPS baru di-deploy di FI-1 (Finlandia), masing-masing dengan IPv4 dedicated dan port 1 Gbps unmetered, dan penagihan per jam plus agent API (dengan TTL auto-destroy) membuat penambahan dan penghapusan node uji menjadi murah. Paket dimulai dari tingkat Wisp; lihat paket VPS.

Ukuran clusterPendekatan
2–5 nodeKonfigurasi ditulis manual, rencana alamat di file teks
5–15 nodeAnsible atau tool konfigurasi lain yang membuat template wg0.conf dari satu inventory
15+ node atau sering berubahMesh manager yang mendistribusikan kunci dan peer secara otomatis, atau desain hub-and-spoke

FAQ

QBagaimana cara menghubungkan beberapa VPS ke jaringan privat?

APasang WireGuard di setiap VPS, beri setiap node alamat dari satu subnet privat, dan cantumkan setiap node lain sebagai peer dengan endpoint publiknya dan AllowedIPs /32. Lalu bind layanan internal ke alamat WireGuard.

QApakah node VPN dalam mesh WireGuard butuh PersistentKeepalive?

ABiasanya tidak, karena setiap node VPS memiliki IP publik dan dapat dijangkau secara langsung. Tambahkan `PersistentKeepalive = 25` hanya untuk node yang berada di balik NAT.

QApa nilai AllowedIPs untuk setiap node VPS?

ASetiap peer hanya mendapat alamat WireGuard miliknya sendiri sebagai /32, plus subnet apa pun yang dirutekan node tersebut. Memakai seluruh subnet cluster untuk setiap peer menyebabkan route tumpang tindih dan merusak mesh.

QBerapa banyak node yang bisa dimiliki mesh WireGuard?

AWireGuard sendiri sanggup menangani banyak peer, tetapi full mesh yang dipelihara manual menjadi merepotkan setelah sekitar sepuluh node karena setiap node membutuhkan konfigurasi setiap node lain. Lebih dari itu, buat konfigurasi dengan otomatisasi atau gunakan mesh manager.

Membangun Cluster VPS Privat dengan Mesh WireGuard · NoctisNode