Episode ini membawa konfigurasi OpenVPN ke ranah yang bisa direproduksi: template-based config, hardening unit systemd, pola env-file untuk rahasia, sampai provisioning otomatis dengan Ansible dan script komunitas seperti openvpn-install.sh.

Konfigurasi yang ditulis manual dan diedit langsung di server adalah bom waktu. Ketika server kedua dibutuhkan, kalian tidak bisa mengingat semua perubahan kecil yang pernah dibuat. Ketika ada yang berubah, tidak ada jejak siapa mengubah apa.
Episode 12 ini membahas configuration management dan automation. Kalian akan belajar menulis konfigurasi berbasis template yang bisa di-render dari data, mengamankan unit systemd OpenVPN, memisahkan rahasia ke env-file, dan memprovisioning server serta client dengan Ansible. Tidak lupa openvpn-install.sh — script komunitas yang populer untuk setup cepat.
Mengapa ini penting? Konsistensi adalah fondasi operasi. Jika konfigurasi kalian dihasilkan dari satu sumber kebenaran, maka drift antar server hilang, rollback menjadi mudah, dan audit menjadi cepat.
Template memisahkan bagian konfigurasi yang berubah-ubah (IP, port, nama) dari bagian yang tetap. Dengan template engine seperti Jinja2, satu template menghasilkan banyak konfigurasi:
server:
name: vpn-primary
port: 1194
network: 10.8.0.0
netmask: 255.255.255.0port {{ server.port }}
proto udp
dev tun
server {{ server.network }} {{ server.netmask }}
topology subnetDengan pola ini, menambahkan server baru cukup menambah entri data dan merender ulang template. Kesalahan pengetikan alamat pun bisa dihindari karena alamat hanya ditulis sekali di data.
Banyak implementasi OpenVPN memakai skema server.conf plus env-file untuk nilai yang berubah antar environment:
# /etc/openvpn/server.env
OVPN_NETWORK=10.8.0.0
OVPN_NETMASK=255.255.255.0OVPN_NETWORK=10.8.0.0 disimpan sebagai env variable, lalu konfigurasi memakainya melalui script wrapper yang merender file. Pola ini membuat konfigurasi yang sama bisa dipakai di development dan production hanya dengan env-file berbeda.
Unit systemd default memberi service akses penuh ke sistem. OpenVPN tidak butuh semua itu — batasi dengan opsi sandbox:
[Service]
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/etc/openvpn /var/log
NoNewPrivileges=trueProtectSystem=strict membuat seluruh filesystem read-only kecuali path yang diizinkan. PrivateTmp memberi service namespace /tmp sendiri, dan NoNewPrivileges mencegah eskalasi privilege. Ini adalah contoh nyata prinsip least privilege untuk daemon VPN.
Placeholder unit OpenVPN memakai pola instance: /etc/systemd/system/openvpn-server@.service. Setiap instance dipanggil dengan nama konfigurasi tanpa ekstensi:
systemctl daemon-reload
systemctl enable openvpn-server@server
systemctl start openvpn-server@serversystemctl start openvpn-server@server menjalankan service dengan /etc/openvpn/server/server.conf. Pola ini memudahkan mengelola banyak instance yang sudah dibahas di episode 11.
Ansible adalah alat paling populer untuk provisioning OpenVPN karena tidak butuh agent di target. Satu playbook bisa menyiapkan server dan menghasilkan file client:
- name: Setup OpenVPN server
hosts: vpn_servers
become: true
tasks:
- name: Install OpenVPN and Easy-RSA
apt:
name:
- openvpn
- easy-rsa
state: presentPlaybook ini idempotent: menjalankannya berulang kali menghasilkan keadaan yang sama. Kalian bisa menambah task untuk mengupload server.conf, memulai service, dan memastikan firewall terbuka.
Playbook juga bisa memuat task untuk membuat sertifikat client dan merender file .ovpn:
- name: Generate client config
template:
src: client.ovpn.j2
dest: /opt/clients/{{ item }}.ovpn
loop: "{{ clients }}"Dengan loop, satu task menghasilkan file client untuk semua pengguna dalam daftar clients. Ini menyelesaikan masalah distribusi konfigurasi client secara terpusat — tema yang dimulai dari episode 9.
Untuk lab dan deployment kecil, script komunitas openvpn-install.sh mengotomatiskan seluruh instalasi — dari package, PKI, konfigurasi server, sampai pembuatan client:
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
./openvpn-install.sh./openvpn-install.sh memandu dengan pertanyaan interaktif: port, protokol, DNS, dan nama client. Script menghasilkan server.conf yang bisa dipakai langsung dan file .ovpn untuk didistribusikan ke pengguna.
Script komunitas hebat untuk prototype dan environment kecil, tapi kurang cocok untuk production besar. Keterbatasannya: konfigurasi hasil script tidak mudah direproduksi di server kedua, dan tidak terintegrasi dengan pipeline manajemen konfigurasi. Untuk produksi, jadikan template dan playbook sebagai sumber kebenaran.
Inti yang harus dibawa pulang:
openvpn-install.sh cocok untuk prototype dan environment kecil.Di episode 13 selanjutnya kita akan membahas security hardening dan best practice — mengamankan control channel dengan tls-crypt-v2, memaksa tls-version-min 1.2, memilih cipher modern dengan forward secrecy, sampai kebijakan firewall dan ACL untuk defense-in-depth. Setelah episode ini, server kalian siap menghadapi pengujian keamanan.