Cara Set Up IKEv2 VPN Server dan Client (Advanced User)

Sebagai prasyarat menggunakan panduan dan sebelum melanjutkan, pastikan kamu sudah berhasil melakukan setup IPsec VPN server kamu sendiri dan upgrade Libreswan ke versi terbaru terkait CVE-2019-10155.

Panduan ini untuk advanced user, alternatif yang lebih mudah dapat menggunakan IPsec/L2TP atau IPsec/XAuth.

Intro

Hampir semua sistem operasi modern saat ini sudah support IKEv2 standard. Dibandingkan dengan IKE versi 1, IKEv2 mengalami penyempurnaan seperti fitur Standard Mobility melalui protokol MOBIKE.

Libreswan dapat mengautentikasi klien IKEv2 berdasarkan certificate X.509 menggunakan RSA signature. Metode ini tidak memerlukan IPsec PSK, username atau password. IKEv2 dapat digunakan oleh:

  • OS X (macOS)
  • iOS (iPhone/iPad)
  • Android > 4.x (menggunakan strongSwan VPN client)
  • Windows 7, 8.x dan 10

:bulb: Kamu tidak perlu mengikuti panduan ini jika kamu hanya memiliki 1 IKEv2 VPN server. Gunakan panduan original disini.

Karena IKEv2 menggunakan key exchange (mirip seperti SSH public & private key auth), kamu perlu mengimport server dan client certificate di device / PC / Mac kamu. Nah, hal ini bisa jadi masalah kedepannya waktu mau manage / revoke certificate yang sudah diinstall sebelumnya jika kamu punya banyak IKEv2 VPN server dengan root CA Common Name dan client certificate username yang sama.

Panduan ini adalah personal snippet gue untuk set up multiple IKEv2 server.
Intinya, gue cuma menambahkan (katakanlah) nama server / node setelah root CA Common Name dan client certificate username.

Set up IKEv2 VPN Server

Contoh berikut adalah cara mengkonfigurasi IKEv2 dengan Libreswan. Setiap perintah dibawah wajib dijalankan sebagai root.

Cari info IP public VPN server, simpan sebagai variable dan lakukan pengecekan dari output command:

PUBLIC_IP=$(dig @resolver1.opendns.com -t A -4 myip.opendns.com +short)
[ -z "$PUBLIC_IP" ] && PUBLIC_IP=$(wget -t 3 -T 15 -qO- http://ipv4.icanhazip.com)
printf '%s\n' "$PUBLIC_IP"

Pastikan output sesuai dengan IP public server. Variable $PUBLIC_IP diperlukan untuk langkah berikutnya.

Buat config IKEv2 ikev2.conf di /etc/ipsec.d/ dan include config tersebut ke /etc/ipsec.conf :

cat > /etc/ipsec.d/ikev2.conf <<EOF

conn ikev2-cp
  left=%defaultroute
  leftcert=$PUBLIC_IP
  leftid=@$PUBLIC_IP
  leftsendcert=always
  leftsubnet=0.0.0.0/0
  leftrsasigkey=%cert
  right=%any
  rightid=%fromcert
  rightaddresspool=192.168.43.10-192.168.43.250
  rightca=%same
  rightrsasigkey=%cert
  narrowing=yes
  dpddelay=30
  dpdtimeout=120
  dpdaction=clear
  auto=add
  ikev2=insist
  rekey=no
  pfs=no
  ike-frag=yes
  ike=aes256-sha2,aes128-sha2,aes256-sha1,aes128-sha1,aes256-sha2;modp1024,aes128-sha1;modp1024
  phase2alg=aes_gcm-null,aes128-sha1,aes256-sha1,aes128-sha2,aes256-sha2
EOF
if ! grep -qs '^include /etc/ipsec\.d/\*\.conf$' /etc/ipsec.conf; then
  echo >> /etc/ipsec.conf
  echo 'include /etc/ipsec.d/*.conf' >> /etc/ipsec.conf
fi

Kita perlu menambahkan beberapa baris konfig lagi di /etc/ipsec.conf berdasar pada versi Libreswan yang terinstall di server. Pertama, cek versi Libreswan:

ipsec --version

Untuk Libreswan versi 3.23 keatas, tambahkan konfig berikut di /etc/ipsec.conf .

  modecfgdns="8.8.8.8 8.8.4.4"
  encapsulation=yes
  mobike=no

Note: Jika server kamu Debian / CentOS / RHEL dan ingin mengenable MOBIKE support, ganti mobike=no dengan mobike=yes dari perintah di atas. JANGAN enable opsi ini di Ubuntu .

Untuk Libreswan 3.19 - 3.22 :

  modecfgdns1=8.8.8.8
  modecfgdns2=8.8.4.4
  encapsulation=yes

Untuk Libreswan < 3.18 :

  modecfgdns1=8.8.8.8
  modecfgdns2=8.8.4.4
  forceencaps=yes

Kamu bisa mengganti Google Public DNS 8.8.8.8 dan 8.8.4.4 dengan DNS milik penyedia server jika mau.

Generate Certificate Authority (CA) dan VPN Server Certificates

  • Kamu bisa menentukan seberapa lama sertifikat ini valid (dalam bulan) dengan menambahkan agrument -v. Misalnya -v 36.
  • Seperti yang udah gue sampaikan sebelumnya, untuk mempermudah memanage multiple server certificate, gue tambahin NAMASERVER setelah IKEv2 VPN CA Common Name. Ubah NAMASERVER dengan sesuatu yang mudah diingat.
certutil -z <(head -c 1024 /dev/urandom) \
  -S -x -n "IKEv2 VPN CA NAMASERVER" \
  -s "O=IKEv2 VPN,CN=IKEv2 VPN CA NAMASERVER" \
  -k rsa -g 4096 -v 36 \
  -d sql:/etc/ipsec.d -t "CT,," -2

Output: (interactive)

Generating key.  This may take a few moments...

Is this a CA certificate [y/N]?
y
Enter the path length constraint, enter to skip [<0 for unlimited path]: >
Is this a critical extension [y/N]?
N

Note: Jika kamu menggunakan nama DNS (bukan alamat IP DNS server) di langkah pertama diatas, kamu perlu mengubah --extSAN "ip:$PUBLIC_IP,dns:$PUBLIC_IP" dari perintah di bawah dengan --extSAN "dns:$PUBLIC_IP" .

certutil -z <(head -c 1024 /dev/urandom) \
  -S -c "IKEv2 VPN CA NAMASERVER" -n "$PUBLIC_IP" \
  -s "O=IKEv2 VPN,CN=$PUBLIC_IP" \
  -k rsa -g 4096 -v 36 \
  -d sql:/etc/ipsec.d -t ",," \
  --keyUsage digitalSignature,keyEncipherment \
  --extKeyUsage serverAuth \
  --extSAN "ip:$PUBLIC_IP,dns:$PUBLIC_IP"

Output:

Generating key.  This may take a few moments...

Generate Client Certificates

Langkah berikutnya adalah membuat client certificate, kemudian export .p12 file yang berisi client certificate, private key dan CA certificate.
Jalankan perintah berikut untuk membuat client certificate:

Note : Ubah VPNUSERNAME dengan username kamu, gue rekomendasikan buat nambahin sedikit info di depan atau dibelakang VPNUSERNAME terkait dengan VPN server untuk memudahkan memanage certificate kedepannya.

certutil -z <(head -c 1024 /dev/urandom) \
  -S -c "IKEv2 VPN CA NAMASERVER" -n "VPNUSERNAME" \
  -s "O=IKEv2 VPN,CN=VPNUSERNAME" \
  -k rsa -g 4096 -v 36 \
  -d sql:/etc/ipsec.d -t ",," \
  --keyUsage digitalSignature,keyEncipherment \
  --extKeyUsage serverAuth,clientAuth -8 "VPNUSERNAME"

output:

Generating key.  This may take a few moments...

Kemudian export certificate dengan perintah pk12util berikut:

pk12util -o VPNUSERNAME.p12 -n "VPNUSERNAME" -d sql:/etc/ipsec.d

Output: (interactive)

Enter password for PKCS12 file:
Re-enter password:
pk12util: PKCS12 EXPORT SUCCESSFUL

NOTE: KAMU HARUS memasukan password yang kuat untuk melindungi .p12 yang telah diexport karena untuk mengimport certificate ke iOS dan MacOS, password tidak boleh kosong.

Kamu bisa mengulangi langkah2 diatas untuk menambahkan VPN user baru, tapi pastikan untuk mengubah setiap VPNUSERNAME dengan user yang baru (misal: VPNUSERNAME2), dst.

Note: Untuk melakukan koneksi beberapa client secara bersamaan, kamu perlu membuat unique certificate untuk setiap perangkat.

(Untuk macOS dan iOS client) Export CA certificate sebagai vpnca_NAMASERVER.cer :

certutil -L -d sql:/etc/ipsec.d -n "IKEv2 VPN CA NAMASERVER" -a -o vpnca_NAMASERVER.cer

Untuk melihat certificate yang ada, kamu bisa jalankan perintah berikut:

certutil -L -d sql:/etc/ipsec.d
Certificate Nickname                               Trust Attributes
                                                   SSL,S/MIME,JAR/XPI

IKEv2 VPN CA NAMASERVER                            CTu,u,u
($PUBLIC_IP)                                       u,u,u
VPNUSERNAME                                        u,u,u

Untuk mnampilkan certificate, gunakan:

certutil -L -d sql:/etc/ipsec.d -n "VPNUSERNAME"

Untuk menghapus certificate, gunakan:

certutil -D -d sql:/etc/ipsec.d -n "VPNUSERNAME"

Untuk informasi dan penggunaan perintah certutil lainnya, baca halaman ini.

Langkah terakhir di setting IKEv2 server setup adalah merestart ipsec service (penting).

service ipsec restart

Proses setup IKEv2 server selesai, ikuti panduan berikutnya di bawah ini untuk konfigurasi VPN client.

Konfig IKEv2 VPN Client

Note: Jika kamu menggunakan nama DNS (bukan alamat IP DNS server) di langkah pertama saat setup IKEv2 server pada variable $PUBLIC_IP , kamu perlu memasukan nama DNS di field Server dan Remote ID.

Config macOS Client

Transfer file vpnca_NAMASERVER.cer dan VPNUSERNAME.p12 ke Mac kamu, kemudian double-click untuk mengimport certificate satu per satu ke login keychain di Keychain Access . Kemudian double-click pada IKEv2 VPN CA NAMASERVER certificate yang telah diimport, klik Trust dan pilih Always Trust dari drop-down menu IP Security (IPsec).

Setelah selesai, cek kembali dan pastikan kedua VPNUSERNAME dan IKEv2 VPN CA NAMASERVER ada di kategori Certificates dari login keychain.

  • Pergi ke bagian Network dari System Preferences .
  • Klik tombol + di window bagian kiri bawah.
  • Pilih VPN dari drop-diwn menu Interface.
  • Pilih IKEv2 dari drop-down menu VPN Type.
  • Service Name : masukkan apapun yang kamu suka (Biasanya nama dari koneksi VPN tersebut).
  • Klik Create .
  • Server Address : IP VPN SERVER KAMU (atau DNS name).
  • Remote ID : IP VPN SERVER KAMU (atau DNS name).
  • Biarkan field Local ID kosong.
  • Klik tombol Authentication Settings….
  • Pilih None dari drop-down menu Authentication Settings.
  • Pilih tombol radio Certificate, kemudian pilih certificate VPNUSERNAME.
  • Klik OK .
  • Centang Show VPN status in menu bar.
  • Klik Apply utuk menyimpan konfigurasi VPN.
  • Klik Connect .

Konfig iOS (iPhone/iPad) Client

Transfer file vpnca_NAMASERVER.cer dan VPNUSERNAME.p12 ke iOS kamu, kemudian import certificate satu per satu sebagai iOS profiles. Untuk mentransfer file ke iOS, kamu bisa gunakan AirDrop atau upload file certificate ke website kamu, kemudian download dan import certificate menggunakan Safari. Setelah selesai, pastikan VPNUSERNAME dan IKEv2 VPN CA NAMASERVER ada di Settings -> General -> Profiles .

  1. Masuk ke Settings -> General -> VPN .
  2. Tap Add VPN Configuration… .
  3. Tap Type . Pilih IKEv2 lalu kembali ke menu sebelumnya.
  4. Description : masukkan apapun yang kamu suka (Biasanya nama dari koneksi VPN tersebut).
  5. Server : IP VPN SERVER KAMU .
  6. Remote ID : IP VPN SERVER KAMU (atau DNS name).
  7. Biarkan field Local ID kosong.
  8. Tap User Authentication . Pilih None kemudian kembali ke menu sebelumnya.
  9. Pastikan tombol switch Use Certificate pada posisi ON.
  10. Tap Certificate . pilih VPNUSERNAME kemudian kembali ke menu sebelumnya.
  11. Tap Done .
  12. Switch tombol VPN ke posisi ON.

Setelah berhasil, kamu akan melihat icon VPN di status bar.

Other Devices

Karena gue cuma pake IKEv2 di Mac dan iPhone (buat kerja), gue ga bisa posting panduan untuk Windows, Linux dan Android disini. Kamu bisa ikuti panduan untuk masing-masing OS disini.

Known issues

  1. Built-in VPN client di Windows mungkin tidak support IKEv2 fragmentation. Di jaringan tertentu, ini dapat menyebabkan gagalnya melakukan koneksi ke server atau masalah-masalah lain.
  2. Jika menggunakan strongSwan Android VPN client, kamu perlu upgrade Libreswan di server kamu ke versi > 3.26.
  3. Jika kamu berhasil konek ke VPN server, tapi tidak bisa membuka website apapun, coba edit /etc/ipsec.conf di server. Cari phase2alg= pada bagian conn ikev2-cp dan hapus aes_gcm-null, . Simpan kemudian restart ipsec: service ipsec restart .
  4. Beberapa pengguna Ubuntu 18.04 dan CentOS menemui error “The password you entered is incorrect” saat mencoba mengimport .p12 file ke Windows. Hal ini karena bug di NSS . Baca diskusi selengkapnya di sini.
  5. Melakukan koneksi menggunakan multiple device secara bersamaan dari NAT yang sama (misalnya konek dari 2 device dari 1 router / WiFi yang sama) saat ini tidak memungkinkan, gunakan IPsec/Xauth berikut:

Credits

Links and Resources

1 Like

Complete series nih ceritanya.
Btw, oot dikit:

miss config?

kok gue bisa edit postingan ente om @ditatompel ? security issue kah atau miss config?

Iya, itu gue buat wiki, jd TL1 keatas emang bisa edit posting yg dibuat wiki => Memahami Sistem Trust Level di Forum devilzc0de.

1 Like