Setup dan Konfigurasi OpenVPN Server | Ubuntu 20.04 LTS
Belajar Konfigurasi VPS Untuk Pemula
Tahun 2021, semakin banyak yang menggunakan dan beralih ke teknologi cloud karena punya segudang fitur yang sangat bermanfaat bagi personal dan company untuk membuat suatu server. Yang ngga kalah menarik adalah harganya kian miring alias murah.
Setelah kalian mengakses server menggunakan SSH atau protokol lainnya, saatnya untuk membuat jalur koneksi secara private yaitu VPN (Virtual Private Network).
Oiya, disini gua membahas lebih jauh mengenai networking ya.. dan gua menggunakan OS Ubuntu pada VPS nya
Tool yang akan kita gunakan adalah OpenVPN.
Apa Itu VPN?
Ketika ingin menggunakan Internet secara aman dan nyaman dari device manapun yang lagi terkoneksi dengan Internet Publik (misalkan Wi-Fi milik Cafe, Restaurant, Hotel, dll) maka diperlukan teknologi yang namanya Virtual Private Network (VPN).
VPN mengizinkan untuk berinternet secara private terhadap koneksi yang terbuka (public dan untrusted) supaya pengguna merasa aman dan nyaman.
Contohnya, saat orang Indonesia yang kerjanya remote dari rumah untuk mengakses resource kantor yang berlokasi di USA.
Topologi
Persiapan
Sebelum install OpenVPN lebih baik persiapkan hal pendukung sebagai berikut:
- User Account yang non-root
- Ubah User Account untuk menjadi Admin
- EasyRSA
- Certificate Authority (CA)
Membuat User Account non-root Untuk CA
- Login ke VPS Ubuntu kalian menggunakan user root
ssh root@server_ip_kalian
Selanjutnya, gua akan menggunakan command asli (bukan syntax)
Tulisan tebal (bold) bisa diubah sesuai konfigurasi VPS kalian
- Cek server IP
ifconfig
- Membuat user untuk CA
adduser gipey
- User gipey, akan dijadikan Administrative Privileges
usermod -aG sudo gipey
- Login dengan akun baru
ssh gipey@100.100.100.1
- Tulis command bebas untuk melakukan test
sudo apt-get update
sudo apt-get upgrade
*EasyRSA
Login menggunakan akun non-root kalian dari VPS untuk menjalankan CA Server (dalam kasus ini, gua memilih install CA Server dengan nama gipey di VPS gua. bukan standalone)
* tanda ini menandakan menggunakan akun gipey untuk CA
- *Login ke akun
gipey
ssh gipey@100.100.100.1
- *Install EasyRSA
sudo apt update
sudo apt install easy-rsa
- *Setelah terinstall, buat folder untuk EasyRSA
mkdir ~/easy-rsa
- *Buat symbolic links yang mengarah ke EasyRSA dari folder CA
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
- *Restrict access direktori PKI
chmod 700 /home/gipey/easy-rsa
- *Inisialisasi PKI dalam folder
easy-rsa
cd ~/easy-rsa
./easyrsa init-pkiOutput
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/sammy/easy-rsa/pki
Certificate Authority
* tanda ini menandakan menggunakan akun gipey untuk CA
- *Buat file populate dengan nama
vars
dalam foldereasy-rsa
dan edit
cd ~/easy-rsa
nano vars~/easy-rsa/vars
set_var EASYRSA_REQ_COUNTRY "Indonesia"
set_var EASYRSA_REQ_PROVINCE "Jakarta"
set_var EASYRSA_REQ_CITY "Jakarta Selatan"
set_var EASYRSA_REQ_ORG "GitHub"
set_var EASYRSA_REQ_EMAIL "admin@kepo.banget"
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
- *Buat root public dan private key untuk CA diatas
./easyrsa build-caOutput
. . .
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
. . .
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/gipey/easy-rsa/pki/ca.crt-------------------------------------------------------------------kalo mau CA nya tanpa password, pake command dibawah ini
./easyrsa build-ca nopass
- *Lihat certificate kita, copy dari
-----BEGIN CERTIFICATE-----
sampai-----END CERTIFICATE-----
cat ~/easy-rsa/pki/ca.crtOutput
-----BEGIN CERTIFICATE-----
AndajOgAwIBAgIUcR9Crsv3FKepoBEujrPZnZnU4nSb5TMwDQYJKoBangetZIhvcNAQELBQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAwMzE4MDMxNjI2WhcNMzAw
. . .
. . .
-----END CERTIFICATE-----
- *Paste key certificate disini
nano /tmp/ca.crt
- *Import key nya ke VPS kalian
sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
Instalasi
Gua menggunakan satu server yang ada OpenVPN dan CA dengan akun non-root
* tanda ini menandakan menggunakan akun gipey untuk CA
Langkah 1 — Installing OpenVPN and Easy-RSA
- Login ke akun
root
ssh root@150.150.150.1
- Install OpenVPN
sudo apt update
sudo apt install openvpn
- Setelah terinstall, buat folder untuk EasyRSA
mkdir ~/easy-rsa
- Buat symbolic links yang mengarah ke EasyRSA dari folder CA
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
- Restrict access direktori PKI
sudo chown root ~/easy-rsa
chmod 700 /root/easy-rsa
Langkah 2 — Creating a PKI for OpenVPN
- Buat file populate dengan nama
vars
dalam foldereasy-rsa
dan edit
cd ~/easy-rsa
nano vars~/easy-rsa/vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
- Inisialisasi PKI dalam folder
easy-rsa
cd ~/easy-rsa
./easyrsa init-pkiOutput
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/gipey/easy-rsa/pki
Langkah 3— Creating an OpenVPN Server Certificate Request and Private Key
- Membuat OpenVPN Server Certificate Request dan private key
cd ~/easy-rsa
./easyrsa gen-req server nopassCommon Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /home/gipey/easy-rsa/pki/reqs/server.req
key: /home/gipey/easy-rsa/pki/private/server.key
- Copy server key ke
/etc/openvpn/server
sudo cp /root/easy-rsa/pki/private/server.key /etc/openvpn/server/
Langkah 4—Signing the OpenVPN Server’s Certificate Request
* tanda ini menandakan menggunakan akun gipey untuk CA
- Login ke OpenVPN Server Certificate Request
scp /root/easy-rsa/pki/reqs/server.req gipey@100.100.100.1:/tmp
- Buat private key dan import certificate request
cd ~/easy-rsa
./easyrsa import-req /tmp/server.req serverOutput
. . .
The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.
- Sign In/Log in ke certificate request
./easyrsa sign-req server serverOutput
. . .
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 3650 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt
- *Login akun
gipey
untuk CA, copyserver.crt
danca.crt
dari CA server ke OpenVPN server (dalam kasus ini, gua masih menggunakan resource yang sama 😆)
scp pki/issued/server.crt root@150.150.150.1:/tmp
scp pki/ca.crt root@150.150.150.1:/tmp
- Kembali ke OpenVPN Server untuk akun
root
, copy file dari/tmp
ke/etc/openvpn/server
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Langkah 5 — Configuring OpenVPN Cryptographic Material
- Generate
tls-crypt
dan jalankan OpenVPN server di~/easy-rsa
cd ~/easy-rsa
openvpn --genkey --secret ta.key
- Copy
ta.key
ke/etc/openvpn/server/
sudo cp ta.key /etc/openvpn/server
Langkah 6— Generating a Client Certificate and Key Pair
* tanda ini menandakan menggunakan akun gipey untuk CA
- Buat struktur direkroti untuk menyimpan client certificate dan key files
mkdir -p ~/client-configs/keys
- Kunci dan amankan folder
chmod -R 700 ~/client-configs
- Jalankan
easyrsa
script dengangen-req
dannopass
cd ~/easy-rsa
./easyrsa gen-req client1 nopass
- Copy
client1.key
ke~/client-configs/keys/
cp pki/private/client1.key ~/client-configs/keys/
- Copy client1.req ke CA Server menggunakan SSH (dalam kasus ini, gua tetap menggunakan resource yang sama)
scp pki/reqs/client1.req gipey@100.100.100.1:/tmp
- Masuk ke CA Server, dan import certificate request
cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1
./easyrsa sign-req client client1Output
. . .
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
- *Login ke akun
gipey
untuk CA, buat client certificate file. Transfer kembali ke Server utama
scp pki/issued/client1.crt root@150.150.150.1:/tmp
- Login ke OpenVPN Server utama, copy cleint certificate ke
~/client-configs/keys/
cp /tmp/client1.crt ~/client-configs/keys/
- Copy
ca.crt
danta.key
ke~/client-configs/keys/
cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown root.root ~/client-configs/keys/*
Langkah 7— Configuring OpenVPN
- Copy
server.conf
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
sudo gunzip /etc/openvpn/server/server.conf.gz
- Edit isi dari
server.conf
sudo nano /etc/openvpn/server/server.confTambahkan dan edit command yang dibold;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key;cipher AES-256-CBC
cipher AES-256-GCM
auth SHA256;dh dh2048.pem
dh noneuser nobody
group nogroup
Langkah 8— Adjusting the OpenVPN Server Networking Configuration
- Edit file
sysctl.conf
, tambahkan command dibawah dibaris paling bawah/akhir
sudo nano /etc/sysctl.confnet.ipv4.ip_forward = 1
- Verifikasi
sudo sysctl -pOutput
. . .
net.ipv4.ip_forward = 1
Langkah 9— Firewall Configuration
- Cek IP dan interface
ip route list defaultOutput
. . .
default via 172.21.240.213 dev eth0 proto dhcp src 172.1.180.99 metric 100
- Edit konfigurasi
before.rules
sudo nano /etc/ufw/before.rules#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
## START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES# Don't delete these required lines, otherwise there will be errors
*filter
. . .
- Edit policy firewall untuk forward packet
sudo nano /etc/default/ufwDEFAULT_FORWARD_POLICY="ACCEPT"
- Setting firewall supaya mengizinkan OpenVPN
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
Langkah 10— Starting OpenVPN
- Enable service OpenVPN
sudo systemctl -f enable openvpn-server@server.service
- Jalankan OpenVPN
sudo systemctl start openvpn-server@server.service
- Cek aktifasi OpenVPN
sudo systemctl status openvpn-server@server.serviceOutput
. . .
● openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-29 15:39:59 UTC; 6s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 16872 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1137)
Memory: 1.0M
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─16872 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --c>
. . .
. . .
Apr 29 15:39:59 ubuntu-20 openvpn[16872]: Initialization Sequence Completed
Langkah 11— Creating the Client Configuration Infrastructure
- Buat direktori untuk menyimpan client configuration
mkdir -p ~/client-configs/files
- Copy example client configuration ke
client-configs
sebagai base configuration
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
- Edit
base.conf
nano ~/client-configs/base.confOutput
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip_public 1194
# remote 150.150.150.1 1194
. . .proto udp# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1cipher AES-256-GCM
auth SHA256# Tambahkan command dibawah ini, letaknya berada diakhir command
key-direction 1;script-security 2
;up /etc/openvpn/update-resolv-conf
;down /etc/openvpn/update-resolv-conf;script-security 2
;up /etc/openvpn/update-systemd-resolved
;down /etc/openvpn/update-systemd-resolved
;down-pre
;dhcp-option DOMAIN-ROUTE .
- Buat compile base configuration
nano ~/client-configs/make_config.sh#!/bin/bash
# First argument: Client identifier
KEY_DIR=/root/client-configs/keys
OUTPUT_DIR=/root/client-configs/files
BASE_CONFIG=/root/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
- Tandai file
chmod 700 ~/client-configs/make_config.sh
Langkah 12— Generating Client Configurations
- Setelah membuat
client1.crt
danclient1.key
, tambahkan beberapa config file dan pindahkan ke~/client-configs
cd ~/client-configs
./make_config.sh client1
- Buat file dengan nama client1.ovpn di
~/client-configs/files
ls ~/client-configs/filesOutput
. . .
client1.ovpn
- Meminta file ke OpenVPN Server
client1.ovpn
, gua menggunakan Windows 10 sebagai client. Untuk membukanya pakai Windows PowerShell
PS C:\WINDOWS\system32> sftp root@150.150.150.1:client-configs/files/client1.ovpn D:/# kalau kalian menggunakan custom port selain 22
PS C:\WINDOWS\system32> sftp -oPort=3412 root@150.150.150.1:client-configs/files/client1.ovpn D:/Output
. . .
root@150.150.150.1's password:Connected to 150.150.150.1.
Fetching /root/client-configs/files/client1.ovpn to D:/client1.ovpn
/root/client-configs/files/client1.ovpn 100% 8394 5.2KB/s 00:01
Langkah 13— Installing the Client Configuration
Gua menggunakan Windows 10 sebagai client untuk menjalankan VPN, maka harus punya app OpenVPN dan konfigurasi sedikit supaya bisa mejalankan client1.ovpn
- Setelah mendapatkan file
client1.ovpn
, pindahkan ke
C:\Program Files\OpenVPN\config
- Jalankan program OpenVPN
Semoga artikel ini bermanfaat, share artikel ini ya. Big thanks! 😘
Referensi: