OpenVPN adalah salah satu layanan VPN (selain PPTP dan L2TP) yang paling fleksibel, aman, dan terpercaya untuk mengamankan komunikasi data, menyediakan akses jarak jauh terenkripsi, serta melindungi resource jaringan.
Berikut adalah cara menginstal dan mengonfigurasi server OpenVPN menggunakan skrip openvpn-install dari Nyr.
Setup #
Jalankan skrip instalasi OpenVPN Server:
wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
Setelah skrip dijalankan, proses setup interaktif akan dimulai. Anda dapat menggunakan nilai default yang disarankan atau memasukkan nilai sesuai kebutuhan.
Contoh tampilan setup:
Welcome to this OpenVPN road warrior installer!
This server is behind NAT. What is the public IPv4 address or hostname?
Public IPv4 address / hostname [xx.xx.xx.xx]:
Which protocol should OpenVPN use?
1) UDP (recommended)
2) TCP
Protocol [1]:
What port should OpenVPN listen on?
Port [1194]:
Select a DNS server for the clients:
1) Default system resolvers
2) Google
3) 1.1.1.1
4) OpenDNS
5) Quad9
6) Gcore
7) AdGuard
8) Specify custom resolvers
DNS server [1]: 3
Enter a name for the first client:
Name [client]:
Pertanyaan yang akan diajukan oleh skrip meliputi:
- Alamat IP Publik — biasanya terdeteksi otomatis.
- Protocol — pilih antara UDP (disarankan, lebih cepat) atau TCP.
- Port — default OpenVPN adalah 1194, tetapi dapat diganti.
- DNS Server — Anda dapat memilih DNS sistem, Google, Cloudflare (1.1.1.1, direkomendasikan), dan lainnya.
- Nama client pertama — digunakan untuk menghasilkan file konfigurasi klien (.ovpn).
Setelah nilai-nilai tersebut dimasukkan, skrip akan otomatis melakukan instalasi OpenVPN Server, termasuk:
- Menginstal paket-paket yang diperlukan
- Menghasilkan kunci enkripsi dan sertifikat
- Mengonfigurasi server OpenVPN
- Menyiapkan aturan firewall dasar
Untuk meningkatkan performa jaringan, Anda dapat mengaktifkan TCP BBR:
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
echo "net.ipv4.tcp_notsent_lowat=16384" >> /etc/sysctl.conf
sysctl -p
Enable User dan Password #
Terdapat dua metode untuk menambahkan autentikasi username & password pada OpenVPN:
- via PAM (menggunakan sistem user Linux)
- via File (menggunakan database user sendiri)
1. Autentikasi via PAM #
Tambahkan baris berikut pada file /etc/openvpn/server/server.conf:
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login
Edit file /etc/openvpn/server/client-common.txt untuk mengaktifkan authentikasi di sisi klien.
auth-user-pass
Restart service OpenVPN.
systemctl restart openvpn-server@server openvpn-iptables
Buat user autentikasi Linux.
adduser --disabled-login client
Generate File .ovpn untuk User
- Jalankan script
openvpn-install.sh - Pilih Add a new client
- Masukkan nama, misalnya client
2. Autentikasi via File #
Tambahkan baris berikut ke /etc/openvpn/server/server.conf:
auth-user-pass-verify /etc/openvpn/check_user.sh via-file
script-security 3
Buat script verifikasi user/password. File: /etc/openvpn/check_user.sh
#!/bin/bash
USER_FILE="/etc/openvpn/users.txt"
USERNAME=$(head -n1 "$1")
PASSWORD=$(tail -n1 "$1")
# Ambil hash untuk user
STORED_HASH=$(grep "^${USERNAME}:" "$USER_FILE" | cut -d':' -f2)
if [ -z "$STORED_HASH" ]; then
echo "User $USERNAME not found"
exit 1
fi
# Verifikasi password dengan bcrypt
RESULT=$(python3 - <<EOF
import bcrypt, sys
password = "$PASSWORD".encode("utf-8")
stored = "$STORED_HASH".encode("utf-8")
if bcrypt.checkpw(password, stored):
sys.exit(0)
else:
sys.exit(1)
EOF
)
if [ $? -eq 0 ]; then
echo "User $USERNAME authenticated successfully"
exit 0
else
echo "Authentication failed for $USERNAME"
exit 1
fi
Set permission script.
chmod 755 /etc/openvpn/check_user.sh
Edit file /etc/openvpn/server/client-common.txt untuk mengaktifkan authentikasi di sisi klien.
auth-user-pass
Restart service OpenVPN.
systemctl restart openvpn-server@server openvpn-iptables
Buat file manage_users.sh untuk menambah, menghapus, dan melihat daftar user:
#!/bin/bash
USER_FILE="/etc/openvpn/users.txt"
# Pastikan file ada
touch "$USER_FILE"
add_user() {
local username="$1"
local password="$2"
# Generate bcrypt hash
local hash=$(python3 - <<EOF
import bcrypt
print(bcrypt.hashpw("$password".encode("utf-8"), bcrypt.gensalt()).decode())
EOF
)
if grep -q "^${username}:" "$USER_FILE"; then
echo "User $username already exists!"
exit 1
fi
echo "${username}:${hash}" >> "$USER_FILE"
echo "User $username added successfully."
}
delete_user() {
local username="$1"
if ! grep -q "^${username}:" "$USER_FILE"; then
echo "User $username not found!"
exit 1
fi
sed -i "/^${username}:/d" "$USER_FILE"
echo "User $username deleted successfully."
}
list_users() {
cut -d':' -f1 "$USER_FILE"
}
usage() {
echo "Usage: $0 add <username> <password>"
echo " $0 del <username>"
echo " $0 list"
exit 1
}
case "$1" in
add)
[ $# -eq 3 ] || usage
add_user "$2" "$3"
;;
del)
[ $# -eq 2 ] || usage
delete_user "$2"
;;
list)
list_users
;;
*)
usage
;;
esac
Tambah User Autentikasi.
bash manage_users.sh add client securepass
Generate File .ovpn untuk User
- Jalankan script
openvpn-install.sh - Pilih Add a new client
- Masukkan nama, misalnya client
Download File .ovpn
#
Pada direktori yang sama saat Anda menjalankan script instalasi, Anda akan menemukan file konfigurasi klien .ovpn, misalnya:
# ls -l
total 40
-rw-r--r-- 1 root root 8256 Nov 21 15:06 client.ovpn
-rw-r--r-- 1 root root 24962 Nov 21 15:02 openvpn-install.sh
Download file .ovpn menggunakan SCP dari komputer lokal Anda.
scp root@YOUR_SERVER_IP:/root/client.ovpn ~/
Connect OpenVPN via nmcli (NetworkManager) #
Import file .ovpn.
nmcli connection import type openvpn file client.ovpn
Tambahkan kredensial login.
nmcli connection modify client +vpn.data username=client
Aktifkan koneksi VPN.
nmcli connection up client --ask