Belajar OpenVPN - Configuration Management & Automation
Episode 12 of 23

Belajar OpenVPN - Configuration Management & Automation

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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-Based Configuration

Memisahkan Data dari Template

Template memisahkan bagian konfigurasi yang berubah-ubah (IP, port, nama) dari bagian yang tetap. Dengan template engine seperti Jinja2, satu template menghasilkan banyak konfigurasi:

Data host dalam YAML
server:
  name: vpn-primary
  port: 1194
  network: 10.8.0.0
  netmask: 255.255.255.0
Contoh template Jinja2
port {{ server.port }}
proto udp
dev tun
server {{ server.network }} {{ server.netmask }}
topology subnet

Dengan 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.

Memakai env-file untuk Variabel

Banyak implementasi OpenVPN memakai skema server.conf plus env-file untuk nilai yang berubah antar environment:

Pola env-file
# /etc/openvpn/server.env
OVPN_NETWORK=10.8.0.0
OVPN_NETMASK=255.255.255.0

OVPN_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.

Hardening Unit Systemd

Membatasi Privilege Unit

Unit systemd default memberi service akses penuh ke sistem. OpenVPN tidak butuh semua itu — batasi dengan opsi sandbox:

Unit systemd yang di-hardening
[Service]
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/etc/openvpn /var/log
NoNewPrivileges=true

ProtectSystem=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.

Menempatkan Unit di Lokasi yang Tepat

Placeholder unit OpenVPN memakai pola instance: /etc/systemd/system/openvpn-server@.service. Setiap instance dipanggil dengan nama konfigurasi tanpa ekstensi:

Kelola instance server
systemctl daemon-reload
systemctl enable openvpn-server@server
systemctl start openvpn-server@server

systemctl start openvpn-server@server menjalankan service dengan /etc/openvpn/server/server.conf. Pola ini memudahkan mengelola banyak instance yang sudah dibahas di episode 11.

Automation dengan Ansible

Ansible adalah alat paling populer untuk provisioning OpenVPN karena tidak butuh agent di target. Satu playbook bisa menyiapkan server dan menghasilkan file client:

Playbook Ansible sederhana
- name: Setup OpenVPN server
  hosts: vpn_servers
  become: true
  tasks:
    - name: Install OpenVPN and Easy-RSA
      apt:
        name:
          - openvpn
          - easy-rsa
        state: present

Playbook ini idempotent: menjalankannya berulang kali menghasilkan keadaan yang sama. Kalian bisa menambah task untuk mengupload server.conf, memulai service, dan memastikan firewall terbuka.

Menghasilkan Konfigurasi Client

Playbook juga bisa memuat task untuk membuat sertifikat client dan merender file .ovpn:

Render client.ovpn via template
- 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.

Script Komunitas: openvpn-install.sh

Setup Cepat dengan Script Interaktif

Untuk lab dan deployment kecil, script komunitas openvpn-install.sh mengotomatiskan seluruh instalasi — dari package, PKI, konfigurasi server, sampai pembuatan client:

Jalankan installer komunitas
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.

Kapan Memakai Script dan Kapan Tidak

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.

Penutup

Inti yang harus dibawa pulang:

  • Template memisahkan data konfigurasi dari struktur tetap.
  • Env-file menyimpan variabel yang berbeda antar environment.
  • Hardening systemd membatasi privilege daemon dengan ProtectSystem dan lainnya.
  • Ansible membuat provisioning server dan client idempotent dan terdokumentasi.
  • openvpn-install.sh cocok untuk prototype dan environment kecil.
  • Sumber kebenaran tunggal mencegah drift antar server.

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.