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 iniListenPort = 51820: port default Wireguard, harus dibuka di firewallPostUp/PostDown: rule iptables yang enable IP forwarding + NAT saat interface up, dan di-reverse saat downPersistentKeepalive = 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 peerwireguard_received_bytes_total: total bytes diterimawireguard_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:
- Handshake tidak pernah terjadi: cek firewall (port 51820/UDP harus dibuka), cek
EndpointIP benar, dan cekPublicKeydi kedua sisi match. - 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. - Koneksi putus setelah beberapa menit: NAT di tengah. Tambahkan
PersistentKeepalive = 25di sisi client. - Throughput rendah: biasanya karena MTU mismatch. Coba turunkan MTU di interface Wireguard:
ip link set wg0 mtu 1380. - 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:
- Generate keypair baru di peer A
- Update public key peer A di konfigurasi peer B, C
- Reload Wireguard di B, C:
wg set wg0 peer <OLD_PUBKEY> remove, lalu reload config - Generate keypair baru di peer B, ulangi proses
- 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
- Wireguard official documentation: wireguard.com/quickstart
- Site-to-site guide: oneuptime.com/blog/wireguard-site-to-site
- Multi-region mesh dengan BIRD BGP failover: vipinpg.com/blog/wireguard-mesh-bgp
- Prometheus Wireguard exporter: github.com/MindFlavor/prometheus_wireguard_exporter
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬