WireGuard adalah protokol VPN modern yang dikenal ringan, cepat, dan mudah dikonfigurasi dibandingkan solusi lama seperti OpenVPN atau IPsec. Salah satu skenario yang cukup umum di lingkungan IoT maupun home lab adalah menghubungkan beberapa Raspberry Pi yang tersebar ke satu server pusat di cloud — dalam hal ini AWS EC2 — agar semua node bisa saling berkomunikasi seolah berada dalam satu jaringan lokal.
Artikel ini membahas cara membangun jaringan VPN dengan topologi hub and spoke menggunakan WireGuard, di mana AWS berperan sebagai hub dan setiap Raspberry Pi berperan sebagai spoke.
Mengenal Topologi Hub and Spoke
Dalam topologi hub and spoke, semua perangkat spoke (Raspberry Pi) hanya terhubung langsung ke hub (AWS). Ketika Pi-1 ingin berkomunikasi dengan Pi-2, paket data dikirim terlebih dahulu ke AWS, lalu diteruskan ke Pi-2. Pendekatan ini lebih sederhana dari topologi mesh karena konfigurasi hanya perlu dilakukan satu kali di server pusat, dan setiap Pi cukup tahu satu alamat tujuan yaitu AWS.
Ilustrasi sederhananya adalah sebagai berikut:
Pi-1 (10.10.0.2) ──┐
Pi-2 (10.10.0.3) ──┤──── AWS Hub (10.10.0.1)
Pi-3 (10.10.0.4) ──┘
Persyaratan Sebelum Mulai
Sebelum memulai konfigurasi, pastikan beberapa hal berikut sudah tersedia:
- Sebuah instance EC2 di AWS dengan sistem operasi berbasis Debian atau Ubuntu, sudah berjalan dan dapat diakses via SSH.
- Security Group AWS sudah membuka port UDP 51820 untuk koneksi masuk.
- Raspberry Pi 3 atau lebih baru dengan Raspberry Pi OS terpasang dan terhubung ke internet.
- Akses root atau sudo di semua perangkat.
Alokasi Alamat IP untuk Jaringan WireGuard
Sebelum memulai instalasi, tentukan terlebih dahulu skema alamat IP yang akan digunakan di dalam tunnel WireGuard. Contoh yang digunakan dalam artikel ini adalah:
| Node | Nama | Alamat WireGuard |
|---|---|---|
| AWS EC2 | Hub | 10.10.0.1 |
| Raspberry Pi 1 | pi-1 | 10.10.0.2 |
| Raspberry Pi 2 | pi-2 | 10.10.0.3 |
| Raspberry Pi 3 | pi-3 | 10.10.0.4 |
Subnet yang digunakan adalah 10.10.0.0/24, cukup untuk menampung hingga 254 node.
Langkah 1 — Instalasi WireGuard di Semua Node
Jalankan perintah berikut di AWS maupun di setiap Raspberry Pi:
sudo apt update
sudo apt install -y wireguard wireguard-tools
Setelah instalasi selesai, aktifkan modul kernel WireGuard dan verifikasi bahwa perintah wg tersedia:
wg --version
Langkah 2 — Membuat Key Pair di Setiap Node
WireGuard menggunakan kriptografi kunci publik. Setiap node harus memiliki pasangan kunci privat dan publik sendiri. Jalankan perintah berikut di masing-masing node secara terpisah:
sudo mkdir -p /etc/wireguard/keys
cd /etc/wireguard/keys
wg genkey | sudo tee private.key | wg pubkey | sudo tee public.key
sudo chmod 600 private.key
Simpan kunci publik dari masing-masing node karena akan dibutuhkan saat konfigurasi peer.
Langkah 3 — Konfigurasi AWS sebagai Hub
Buat file konfigurasi WireGuard di server AWS. File ini menjadi pusat dari seluruh jaringan:
# /etc/wireguard/wg0.conf — AWS Server
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <PRIVATE_KEY_AWS>
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Peer: pi-1
[Peer]
PublicKey = <PUBLIC_KEY_PI_1>
AllowedIPs = 10.10.0.2/32
PersistentKeepalive = 25
# Peer: pi-2
[Peer]
PublicKey = <PUBLIC_KEY_PI_2>
AllowedIPs = 10.10.0.3/32
PersistentKeepalive = 25
# Peer: pi-3
[Peer]
PublicKey = <PUBLIC_KEY_PI_3>
AllowedIPs = 10.10.0.4/32
PersistentKeepalive = 25
Beberapa catatan penting pada konfigurasi di atas:
- Bagian
PostUpmengaktifkan IP forwarding dan iptables agar paket bisa diteruskan antar Pi. AllowedIPsuntuk setiap peer diisi dengan IP spesifik masing-masing Pi (/32), bukan seluruh subnet.PersistentKeepalivedi-set 25 detik untuk menjaga koneksi tetap hidup meski Pi berada di balik NAT.
Langkah 4 — Konfigurasi Setiap Raspberry Pi sebagai Spoke
Buat file konfigurasi di masing-masing Raspberry Pi. Contoh untuk Pi-1:
# /etc/wireguard/wg0.conf — Raspberry Pi 1
[Interface]
Address = 10.10.0.2/24
PrivateKey = <PRIVATE_KEY_PI_1>
DNS = 1.1.1.1
PostUp = sysctl -w net.ipv4.ip_forward=1
[Peer]
# AWS Hub
PublicKey = <PUBLIC_KEY_AWS>
Endpoint = <IP_PUBLIK_AWS>:51820
AllowedIPs = 10.10.0.0/24
PersistentKeepalive = 25
Perbedaan kunci dengan konfigurasi server adalah pada AllowedIPs di sisi Pi diisi 10.10.0.0/24 — seluruh subnet WireGuard. Ini memungkinkan Pi mengirim paket ke Pi lain melalui AWS, bukan hanya ke AWS saja.
Ulangi langkah ini untuk Pi-2 dan Pi-3, sesuaikan alamat IP pada bagian Address.
Langkah 5 — Mengaktifkan dan Menjalankan WireGuard
Jalankan perintah berikut di semua node (AWS dan setiap Pi) untuk mengaktifkan WireGuard dan memastikannya berjalan otomatis saat reboot:
sudo chmod 600 /etc/wireguard/wg0.conf
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
Cek status koneksi dengan:
sudo wg show
Output akan menampilkan daftar peer yang terhubung beserta waktu koneksi terakhir dan jumlah data yang ditransfer.
Langkah 6 — Menambahkan Pi Baru Tanpa Restart Server
Salah satu keunggulan WireGuard adalah kemampuan menambahkan peer baru secara langsung tanpa perlu merestart layanan. Ketika ada Raspberry Pi baru yang ingin bergabung, lakukan langkah berikut:
Pertama, buat key pair di Pi baru dan catat kunci publiknya. Kemudian di AWS, tambahkan blok peer baru ke file konfigurasi dan jalankan perintah berikut untuk mendaftarkannya secara live:
sudo wg set wg0 peer <PUBLIC_KEY_PI_BARU> allowed-ips 10.10.0.5/32 persistent-keepalive 25
Tambahkan juga entri peer tersebut ke file /etc/wireguard/wg0.conf agar tetap tersimpan setelah reboot.
Langkah 7 — Membuka Port WireGuard di AWS dan Firewall Server
Agar Raspberry Pi dapat terhubung ke server WireGuard, pastikan port WireGuard (default UDP 51820) terbuka di seluruh layer firewall.
AWS EC2 Security Group
Di AWS Console, buka EC2 → Security Groups → Inbound Rules, lalu tambahkan rule:
Type: Custom UDP
Port: 51820
Source: 0.0.0.0/0
Jika ingin lebih aman, source dapat dibatasi ke IP publik lokasi Raspberry Pi.
Jika menggunakan UFW di server Ubuntu
Izinkan trafik WireGuard:
sudo ufw allow 51820/udp
Verifikasi aturan firewall:
sudo ufw status
Output seharusnya menampilkan:
51820/udp ALLOW Anywhere
Tanpa membuka port ini, WireGuard client akan tetap mengirim paket handshake, tetapi server tidak akan pernah merespons sehingga koneksi terlihat aktif di sisi client namun tidak pernah benar-benar terhubung.
Verifikasi Koneksi
Setelah semua node aktif, lakukan pengujian ping dari salah satu Pi ke node lain:
# Dari Pi-1, ping ke AWS
ping 10.10.0.1
# Dari Pi-1, ping ke Pi-2
ping 10.10.0.3
Jika ping berhasil, jaringan WireGuard sudah berfungsi dengan benar. Apabila ping gagal, periksa hal-hal berikut:
- Pastikan kunci publik yang dimasukkan ke konfigurasi peer sudah benar dan tidak ada karakter yang terpotong.
- Pastikan
wg showdi AWS menampilkan semua Pi sebagai peer yang aktif dengan nilailatest handshakeyang baru. - Periksa kembali Security Group AWS dan pastikan port 51820 UDP terbuka.
- Pastikan
net.ipv4.ip_forwardbernilai 1 di server AWS dengan perintahsysctl net.ipv4.ip_forward.
Menghapus Peer yang Tidak Digunakan
Ketika sebuah Raspberry Pi sudah tidak digunakan lagi, hapus peer-nya dari jaringan dengan perintah berikut di AWS:
sudo wg set wg0 peer <PUBLIC_KEY_PI> remove
Jangan lupa hapus juga blok [Peer] yang bersangkutan dari file /etc/wireguard/wg0.conf.
Kesimpulan
Membangun jaringan VPN dengan WireGuard untuk menghubungkan banyak Raspberry Pi ke sebuah server AWS tidaklah rumit apabila menggunakan topologi hub and spoke. Konfigurasi terpusat di satu titik yaitu AWS, sementara setiap Pi cukup mengenal satu endpoint. Hasilnya adalah jaringan privat yang stabil, terenkripsi, dan mudah diperluas tanpa harus mengkonfigurasi ulang node yang sudah berjalan.