Tutorial

Wireguard Site-to-Site VPN untuk Multi-Region VPS: Panduan Lengkap 2026

Wireguard Site-to-Site VPN untuk Multi-Region VPS: Panduan Lengkap 2026

Dulu, untuk menghubungkan server di region berbeda, pilihan gue biasanya pakai IPsec tunnel atau SSH reverse tunnel. Tapi sejak Wireguard keluar di kernel Linux 5.6 (2020), hampir semua setup VPN gue migrate ke sana. Alasannya simple: Wireguard punya 4000 baris kode (vs OpenVPN 100K+), kecepatan wire-speed, konfigurasi flat single-file, dan audit yang jauh lebih simpel. Artikel ini panduan lengkap untuk setup Wireguard site-to-site antar VPS — use case yang paling sering gue jumpai untuk client yang punya database replication, monitoring stack multi-region, atau butuh komunikasi private antar server.

Apa itu Wireguard dan Kenapa Dipilih?

Wireguard adalah VPN protocol modern yang masuk mainline kernel Linux 5.6. Berbeda dengan OpenVPN atau IPsec, Wireguard menggunakan single cryptographic suite (Curve25519 untuk key exchange, ChaCha20 untuk encryption, Poly1305 untuk MAC) yang sudah diaudit dan terbukti aman. Tidak ada cipher negotiation — server dan client harus pakai algoritma yang sama, dan hanya ada satu kombinasi yang tersedia.

Keuntungan Wireguard untuk site-to-site setup:

  • Performa tinggi: diukur di atas 1 Gbps pada hardware modern, hampir wire-speed.
  • Konfigurasi flat: satu file INI-style per interface, tidak ada hierarchical config.
  • Stealth-friendly: tidak merespon ke paket yang tidak authenticated, jadi port scan tidak detect Wireguard server (terlihat seperti "filtered").
  • Roaming support: client bisa pindah IP tanpa re-establish connection.
  • Kernel-native: berjalan sebagai kernel module, bukan userspace daemon.

Untuk use case site-to-site, Wireguard mengalahkan OpenVPN di hampir semua metrik. Yang masih menjadi pilihan IPsec: jika lo sudah punya hardware firewall (Fortigate, Palo Alto, pfSense) yang support IPsec native. Tapi untuk VPS Linux-to-Linux, Wireguard tidak tertandingi.

Topologi: Skenario Real Gue

Setup yang akan gue bahas: 3 VPS di region berbeda, masing-masing menjalankan service berbeda, butuh private network untuk:

  • Database replication primary (Singapore) → standby (Frankfurt)
  • Monitoring agent di semua region push metrics ke Prometheus central (US East)
  • Internal API call antar service yang tidak boleh ter-expose ke internet

IP plan:

  • VPS Singapore (primary): public 43.157.x.x, VPN 10.10.10.1/24
  • VPS Frankfurt (standby): public 84.46.x.x, VPN 10.10.10.2/24
  • VPS US East (monitoring): public 23.238.x.x, VPN 10.10.10.3/24

Subnet Wireguard: 10.10.10.0/24. Setiap peer dapat /32. Gateway ke internet melalui VPS Singapore untuk failover.

Install Wireguard

Untuk Ubuntu 22.04+/24.04+, Wireguard sudah ada di mainline kernel. Install tool-nya:

sudo apt update
sudo apt install wireguard wireguard-tools qrencode

Untuk RHEL/Rocky 9+, install dari EPEL:

sudo dnf install epel-release elrepo-release
sudo dnf install kmod-wireguard wireguard-tools

Verifikasi kernel module loaded:

sudo modprobe wireguard
lsmod | grep wireguard
# Expected: wireguard  45056  0

Generate Key Pair untuk Setiap VPS

Setiap peer butuh key pair (private + public). Generate di setiap VPS:

umask 077
wg genkey | tee /etc/wireguard/private.key | wg pubkey > /etc/wireguard/public.key
chmod 600 /etc/wireguard/private.key
cat /etc/wireguard/public.key

Simpan private key dengan permission 600. Public key boleh disebar (untuk konfigurasi peer). Catat public key masing-masing VPS untuk step berikutnya.

Konfigurasi di VPS Singapore (Primary)

Buat file /etc/wireguard/wg0.conf:

[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = <SG_PRIVATE_KEY>
# Enable IP forwarding supaya traffic dari peer bisa keluar
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Frankfurt
PublicKey = <FR_PUBLIC_KEY>
AllowedIPs = 10.10.10.2/32
Endpoint = 84.46.x.x:51820
PersistentKeepalive = 25

[Peer]
# US East
PublicKey = <US_PUBLIC_KEY>
AllowedIPs = 10.10.10.3/32
Endpoint = 23.238.x.x:51820
PersistentKeepalive = 25

Penjelasan:

  • Address = 10.10.10.1/24: IP Wireguard interface di VPS ini
  • ListenPort = 51820: port default Wireguard, harus dibuka di firewall
  • PostUp/PostDown: rule iptables yang enable IP forwarding + NAT saat interface up, dan di-reverse saat down
  • PersistentKeepalive = 25: kirim keepalive setiap 25 detik supaya NAT mapping tidak expire

Konfigurasi di VPS Frankfurt (Standby)

[Interface]
Address = 10.10.10.2/24
PrivateKey = <FR_PRIVATE_KEY>

[Peer]
# Singapore primary
PublicKey = <SG_PUBLIC_KEY>
AllowedIPs = 10.10.10.0/24
Endpoint = 43.157.x.x:51820
PersistentKeepalive = 25

Perhatikan AllowedIPs di peer Frankfurt: 10.10.10.0/24, bukan 10.10.10.1/32. Ini karena Frankfurt butuh akses ke semua IP di subnet Wireguard (termasuk US East), bukan cuma Singapore. Ini salah satu hal yang sering bikin bingung orang baru Wireguard — AllowedIPs artinya "IP mana yang boleh di-route melalui peer ini" di sisi client, bukan di sisi server.

Konfigurasi di VPS US East (Monitoring)

[Interface]
Address = 10.10.10.3/24
PrivateKey = <US_PRIVATE_KEY>

[Peer]
# Singapore primary
PublicKey = <SG_PUBLIC_KEY>
AllowedIPs = 10.10.10.0/24
Endpoint = 43.157.x.x:51820
PersistentKeepalive = 25

Enable IP Forwarding Permanently

Wireguard butuh IP forwarding enabled supaya traffic antar peer bisa di-forward. Set di /etc/sysctl.conf:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Apply tanpa reboot:

sudo sysctl -p

Firewall Rules

Setiap VPS butuh firewall rule untuk allow Wireguard port. Contoh pakai UFW:

sudo ufw allow 51820/udp comment "Wireguard"
sudo ufw reload

Untuk VPS Singapore yang berfungsi sebagai gateway, pastikan forwarding rule di iptables juga ada:

sudo iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Atau lebih clean, pakai nftables:

table inet wireguard {
  chain forward {
    type filter hook forward priority 0; policy accept;
    ct state established,related accept
    iifname "wg0" accept
  }
  chain postrouting {
    type nat hook postrouting priority srcnat;
    oifname "eth0" masquerade
  }
}

Start dan Verifikasi

Enable dan start Wireguard di semua VPS:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0

Verifikasi status:

sudo wg show
# Expected output:
# interface: wg0
#   public key: ...
#   private key: (hidden)
#   listening port: 51820
#
# peer: ...
#   endpoint: 84.46.x.x:51820
#   allowed ips: 10.10.10.2/32
#   latest handshake: 12 seconds ago
#   transfer: 1.23 MiB received, 845.12 KiB sent
#   persistent keepalive: every 25 seconds

Test connectivity antar peer:

# Dari Singapore
ping 10.10.10.2
ping 10.10.10.3

# Dari Frankfurt ke US East via Singapore
ping 10.10.10.3

Kalau ping sukses, Wireguard site-to-site sudah jalan. Yang penting: pastikan latest handshake muncul, kalau tidak ada kemungkinan firewall block atau key salah.

Use Case: PostgreSQL Replication via Wireguard

Setelah Wireguard jalan, setup PostgreSQL streaming replication melalui private IP 10.10.10.x:

Di Singapore (primary), edit postgresql.conf:

listen_addresses = 'localhost,10.10.10.1'
wal_level = replica
max_wal_senders = 3
wal_keep_size = '1GB'

Edit pg_hba.conf:

host replication replicator 10.10.10.2/32 md5

Di Frankfurt (standby), edit recovery configuration dan gunakan pg_basebackup via Wireguard IP:

pg_basebackup -h 10.10.10.1 -D /var/lib/postgresql/16/main -U replicator -P -Xs -R

Setelah itu standby akan sync dari primary via VPN tunnel. Traffic replication ter-encrypt dan tidak melalui public internet, memenuhi compliance untuk data sensitive.

Monitoring Wireguard

Untuk monitoring, scrape metrics wg show ke Prometheus. Ada exporter sederhana yang bisa dipakai: prometheus_wireguard_exporter. Metrics yang berguna:

  • wireguard_sent_bytes_total: total bytes terkirim per peer
  • wireguard_received_bytes_total: total bytes diterima
  • wireguard_latest_handshake_seconds: kapan terakhir handshake, alert kalau lebih dari 3 menit (peer mungkin down)

Contoh alert rule Prometheus:

- alert: WireguardPeerDown
  expr: time() - wireguard_latest_handshake_seconds > 180
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Wireguard peer {{ $labels.peer }} tidak handshake"

Troubleshooting Umum

Masalah yang sering muncul saat setup:

  1. Handshake tidak pernah terjadi: cek firewall (port 51820/UDP harus dibuka), cek Endpoint IP benar, dan cek PublicKey di kedua sisi match.
  2. Handshake sukses tapi tidak ada data: cek AllowedIPs. Sisi server harus include IP client, sisi client harus include IP subnet yang mau di-route. Salah satu konfigurasi yang sering bikin pusing.
  3. Koneksi putus setelah beberapa menit: NAT di tengah. Tambahkan PersistentKeepalive = 25 di sisi client.
  4. Throughput rendah: biasanya karena MTU mismatch. Coba turunkan MTU di interface Wireguard: ip link set wg0 mtu 1380.
  5. IPv6 leak: kalau tidak butuh IPv6 di tunnel, block di PostUp: iptables -A FORWARD -i wg0 ! -s 10.10.10.0/24 -j DROP.

Untuk debug, selalu cek sudo wg show dulu — di sana kelihatan status handshake, transfer, dan endpoint peer. Kalau handshake sukses tapi transfer tetap 0, masalah di AllowedIPs atau routing, bukan di Wireguard itu sendiri.

Key Management dan Rotation

Best practice: rotate keypair setiap 6-12 bulan. Prosesnya straightforward tapi harus dilakukan di semua peer bersamaan untuk menghindari disconnect:

  1. Generate keypair baru di peer A
  2. Update public key peer A di konfigurasi peer B, C
  3. Reload Wireguard di B, C: wg set wg0 peer <OLD_PUBKEY> remove, lalu reload config
  4. Generate keypair baru di peer B, ulangi proses
  5. Generate keypair baru di peer C, ulangi proses

Untuk otomasi, simpan keypair di Vault atau AWS Secrets Manager, dan push via Ansible/Chef. Tapi untuk setup kecil 3-4 peer, manual rotation tiap 6 bulan cukup.

Kesimpulan

Wireguard site-to-site VPN adalah solusi modern untuk private network antar VPS. Konfigurasinya flat dan readable, performanya mendekati wire-speed, dan keamanannya terbukti. Setelah pakai setup ini untuk 4 client dengan topology berbeda, gue selalu recommend Wireguard dibanding IPsec atau OpenVPN untuk use case Linux-to-Linux.

Untuk monitoring multi-region stack yang gue bahas di sini, kombinasi Wireguard + Prometheus + alerting yang solid sudah cukup untuk production. Dan kalau lo butuh setup yang lebih advanced (full mesh dengan auto-failover via BGP), bisa juga explore firewall Ubuntu dan self-hosted Kubernetes sebagai konteks deployment yang lebih besar.

Sumber

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.