Setup OpenVPN Server Untuk Remote Access
Di Google Cloud Platform
Membuka remote access dari resources kita pada cloud menuju ke internet memungkinkan kita untuk dapat mengakses resources kita kapan pun dan di mana pun kita berada. Namun, hal ini dapat menyebabkan resources kita menjadi rentan terhadap berbagai ancaman dari serangan cyber dan kebocoran data, terlebih jika kita mencoba untuk mengaksesnya melalui jaringan internet yang tidak aman seperti wifi publik pada cafe atau tempat-tempat umum lainnya. Untuk itu, keamanan dari akses jaringan menuju ke resources cloud sangat perlu untuk diperhatikan.
Ada berbagai solusi pengamanan akses jaringan kita di cloud melalui internet. Beberapa cara yang umum ditemui adalah dengan menggunakan bastion host dan VPN server. Bastion host adalah sebuah komputer atau instance yang berperan sebagai single entry point yang dapat melindungi resources kita di dalam jaringan dari unauthorized access serta serangan cyber dan dapat diakses melalui secure protocols seperti SSH dan RDP. Sedangkan VPN (Virtual Private Network) adalah teknologi yang memungkinkan pengguna untuk mengakses jaringan melalui internet menggunakan enkripsi dan protokol tunneling dengan menciptakan koneksi yang aman antara device pengguna dengan jaringan tersebut. Meskipun keduanya sering diperdebatkan, namun penggunaan VPN sendiri memiliki beberapa keunggulan dibandingkan dengan bastion host. VPN lebih mudah untuk digunakan terutama jika kita perlu untuk memberikan akses bagi pengguna awam yang tidak memiliki latar belakang IT. Selain itu, VPN juga memiliki fitur access controls yang memungkinkan kita untuk mengatur siapa saja yang dapat mengakses suatu resource untuk meminimalisir unauthorized access.
OpenVPN adalah software open-source yang dapat digunakan untuk membuat koneksi VPN secara gratis serta dapat berjalan di berbagai operating system dan device. Pada artikel ini, akan dijelaskan mengenai langkah-langkah untuk setup OpenVPN server di Google Cloud Platform (GCP) dan cara mengaksesnya melalui OpenVPN Client. Sebagai contoh, kita akan menyiapkan arsitektur sederhana yang berisikan satu buah subnet, dimana terdapat dua buah instance, antara lain sebuah Internal-instance yang berfungsi sebagai instance yang menjadi target dan tidak memiliki akses ingress dari internet dan VPN-server yang dapat diakses dari internet melalui port UDP 1194 untuk OpenVPN. Dengan mengakses VPN-server melalui OpenVPN, diharapkan agar user dapat mengakses Internal-instance meskipun tidak memiliki akses ingress dari internet.
Persiapan
- Akun Google Cloud Platform
- PuTTY dan PuTTYGen
- OpenVPN GUI
Enable Compute Engine
Sebelum kita melangkah menuju pembuatan arsitektur, kita perlu untuk melakukan enable API pada Google Cloud Platform. API yang perlu untuk kita aktifkan adalah Compute Engine API.
Menyiapkan VPC dan Subnet
Langkah pertama yang perlu kita lakukan adalah kita menyiapkan sebuah VPC yang terdiri dari Public dan Private subnet. Untuk membuat sebuah VPC kunjungi VPC Networks dan pada bagian atas klik CREATE VPC NETWORK.
Isi informasi dari VPC yang akan dibuat dengan nama dan deskripsi. Pastikan pada bagian Subnet creation mode Anda memilih custom.
Selanjutnya kita akan membuat public-subnet. Pada bagian New subnet isikan name dengan public-subnet dan deskripsinya lalu pilih region yang diinginkan dan isikan IPv4 range contohnya 10.0.0.0/24. Jika sudah, maka klik DONE.
Setelah berhasil membuat public-subnet, maka klik tombol CREATE pada bagian bawah untuk membuat VPC. Setelah VPC berhasil dibuat maka akan muncul pada list VPC networks.
Mengatur Firewall Rule
Selanjutnya kita akan mengatur firewall rule pada VPC agar instance dapat diakses melalui SSH dan VPN. Terdapat 2 rule yang akan kita buat, yaitu allow-ssh-internal dan allow-ssh-openvpn. Untuk itu, pergi ke halaman VPC Networks dan klik VPC yang kita buat sebelumnya dan pindah ke halaman FIREWALLS dan klik ADD FIREWALL RULE.
Isikan nama rule dengan allow-ssh-internal. Pastikan Network yang dipilih adalah VPC yang kita buat sebelumnya. Pilih Direction of traffic menjadi Ingress dan Action on match Allow.
Pada targets pilih Specified target tags dan masukkan internal pada target tags. Pada source filter pilih IPv4 ranges dan masukkan IP range dari public subnet yang kita buat, yaitu 10.0.0.0/24. Pada Protocols and ports pilih TCP dan masukkan port 22. Dengan rule ini, internal instance kita dapat diakses melalui SSH hanya dari dalam public-subnet.
Setelah selesai, klik CREATE untuk membuat firewall rule. Lakukan langkah yang sama untuk rule allow-ssh-openvpn. Namun, untuk akses SSH pada VPN server, kita akan buka ingress dari internet. Pada bagian targets masukkan vpn-server dan pada IPv4 ranges masukkan 0.0.0.0/0 agar dapat melakukan akses SSH dan VPN melalui internet. Bagian Protocols and ports pilih TCP 22 untuk akses SSH dan UDP 1194 untuk akses VPN.
Setelah dibuat, maka akan tampak dua buah rule pada list Firewall rules di VPC kita.
Memasang SSH Key
Pada Google Cloud Platform, ketika kita membuat sebuah instance, secara default GCP tidak men-generate SSH key untuk instance kita agar dapat diakses secara external. Namun, GCP memberikan fitur jika kita ingin menambahkan SSH key sendiri. Untuk itu, sebelum kita membuat instance, kita perlu memasang SSH key terlebih dahulu. Untuk artikel ini, akses SSH dan pembuatan SSH key menggunakan PuTTY dan PuTTYGen.
Buka aplikasi PuTTYGen dan klik GENERATE pada bagian generate a public/private key pair, lalu gerakkan mouse secara acak di dalam window aplikasi. Pastikan type of key adalah RSA.
Setelah melakukan generate, ganti pada bagian Key comment dengan nama user yang akan digunakan untuk login. Setelah selesai, copy bagian Public key, bagian ini akan kita simpan ke GCP, lalu klik Save private key untuk menyimpan private key di komputer kita, private key akan digunakan untuk mengakses instance kita melalui PuTTY.
Pada GCP, kunjungi halaman Compute Engine dan pada sidebar sebelah kiri scroll ke bawah hingga menemukan Metadata. Lalu klik ADD METADATA.
Pindah ke bagian SSH KEYS lalu klik ADD ITEM. Masukkan public key yang telah kita copy sebelumnya dari PuTTYGen. Pastikan public key tidak memiliki spasi atau enter tambahan. Jika sudah maka klik SAVE pada bagian bawah.
Setelah berhasil save, maka akan muncul pada list username dan public key yang telah kita inputkan tadi.
Membuat Internal-Instances
Setelah selesai membuat VPC dan subnet, kita akan membuat instance baru untuk internal instance. Kunjungi Compute Engine dan pilih VM Instances, lalu klik CREATE INSTANCE.
Isi name dengan internal-instance lalu pilih region sesuai dengan region public-subnet yang tadi kita buat, setelah itu pilih zone yang diinginkan. Lalu pada bagian Machine configuration sesuaikan dengan kebutuhan dan budget yang dibutuhkan.
Pada bagian Boot disk klik tombol CHANGE, lalu sesuaikan dengan image OS yang diinginkan, dalam artikel ini akan menggunakan Ubuntu 20.04 LTS.
Scroll ke bawah pada bagian Advance options lalu buka bagian Networking. Pada bagian network tags, masukkan nama tag internal sesuai dengan nama network tag yang telah kita atur pada Firewall rule allow-ssh-internal.
Di bagian Network interfaces secara default akan diarahkan pada VPC default. Ganti Network interface dengan VPC yang telah kita buat tadi dan pilih Subnetwork dengan public-subnet.
Setelah itu, klik CREATE untuk membuat instance baru dan tunggu beberapa saat hingga instance berhasil dibuat.
Mencoba akses SSH ke internal-instance
Mari kita coba akses ke internal-instance dari internet menggunakan private key yang kita simpan sebelumnya. Buka aplikasi PuTTy dan pada bagian Session masukkan pada Host Name dengan external IP dari internal-instance. Pastikan Connection Type adalah SSH.
Pada sidebar sebelah kiri, masuk ke bagian Connection lalu ubah bagian Seconds between keepalives menjadi 30.
Masih pada bagian Connection, masuk lagi ke bagian SSH > Auth > Credentials dan pada bagian Private key file for authentication klik Browse dan pilih file private key berekstensi .ppk yang sebelumnya telah kita simpan dari PuTTYGen.
Setelah selesai, klik Open untuk mencoba akses. Disini, PuTTY akan menampilkan pesan error Connection timed out. Meskipun internal-instance memiliki external IP, kita tidak dapat mengaksesnya melalui SSH karena Rule Firewall allow-ssh-internal yang kita buat sebelumnya tidak mengizinkan kita untuk melakukan akses SSH dari internet. Internal-instance dapat diakses melalui SSH hanya jika source-nya berasal dari public-subnet. Untuk itu, kita akan membuat VPN server dengan tujuan agar device kita seolah-olah berada di dalam public-subnet.
Membuat VPN-server
Lakukan langkah yang sama untuk membuat instance VPN-server. Berikan nama instance vpn-server dan lakukan pengaturan sama seperti membuat internal-instance. Masuk di bagian Networking, isi pada bagian Network tags dengan vpn-server sesuai dengan nama tags pada rule firewall allow-ssh-openvpn.
Jangan lupa untuk mengubah Network Interface menjadi VPC yang telah kita buat dan Subnetwork menjadi public-subnet sama seperti pada internal-instance. Pada bagian External IPv4 address pilih CREATE IP ADDRESS untuk memembuat static IP baru. Kita perlu melakukan ini karena setiap kali kita melakukan restart pada instance kita, maka secara otomatis GCP akan memasangkan external IP baru. Kita tidak ingin external IP dari VPN-server berubah-ubah, hal ini berkaitan dengan konfigurasi dari OpenVPN. Setelah klik CREATE IP ADDRESS, akan muncul tampilan Reserve a new static IP Address. Masukkan nama ip-vpn-server dan klik RESERVE.
Setelah selesai, maka sekarang kita telah memiliki dua buah instance yang berjalan di VPC kita.
Mencoba Akses SSH ke VPN-server
Setelah instance VPN-server berhasil dibuat, coba akses instance melalui SSH menggunakan PuTTY dengan langkah-langkah yang telah dijelaskan sebelumnya. Ganti bagian Host name dengan external IP dari VPN-server. Terlihat bahwa kita berhasil untuk mengakses VPN-server melalui SSH dan tidak tampak pesan error seperti sebelumnya. Hal ini karena rule firewall yang digunakan mengizinkan kita untuk melakukan ingress dari internet melalui port TCP 22 (SSH). Untuk melakukan login gunakan nama user sesuai dengan yang ada pada Metadata, dalam kasus ini adalah user1.
Kita juga dapat mengakses instance melalui Console GCP dengan klik tombol SSH pada bagian Connect di list VM instances.
Install OpenVPN di VPN-server
Langkah selanjutnya setelah kita mengakses VPN-server adalah melakukan installasi OpenVPN. Masukkan 2 command berikut untuk melakukan update apt pada instance terlebih dahulu.
sudo apt update
sudo apt upgrade
Selanjutnya, kita akan melakukan installasi OpenVPN menggunakan wizard script yang telah disediakan oleh pihak OpenVPN. Untuk melakukannya kita download terlebih dahulu scriptnya dengan memasukkan command wget berikut.
wget https://git.io/vpn -O openvpn-ubuntu-install.sh
Jika kita ingin menggunakan password ketika autentifikasi user pada OpenVPN Client, kita bisa menggunakan script berbeda yang bisa didownload melalui command berikut.
wget https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh -O openvpn-ubuntu-install.sh
Setelah kita mendownload script, kita akan mengubahnya menjadi executable dengan mengubah permissions menggunakan command chmod. Untuk melakukannya, jalankan command berikut.
chmod -v +x openvpn-ubuntu-install.sh
Jalankan openvpn-ubuntu-install.sh dengan memasukkan command berikut
sudo ./openvpn-ubuntu-install.sh
Setelah itu maka akan muncul beberapa pertanyaan pengaturan untuk melakukan installasi OpenVPN pada instance Ubuntu. Pada bagian hostname masukkan External IP dari instance VPN-server atau tekan enter jika sudah sesuai. Pada bagian protocol gunakan UDP dengan memasukkan angka 1. Pada port yang digunakan adalah 1194 sesuai dengan default OpenVPN. Untuk DNS kita bisa bebas memilih DNS Server yang akan digunakan, untuk kali ini kita akan menggunakan DNS server milik Google. Terakhir, kita akan memasukkan nama client yang akan digunakan ketika mengakses OpenVPN. Disini kita akan menggunakan nama client1. Setelah selesai, maka tekan enter untuk melanjutkan installasi.
Setelah proses install selesai, maka di bagian bawah akan muncul pesan Finished dan path dimana file client config disimpan.
Kita dapat melakukan cek apakah service OpenVPN telah berjalan di instance kita dengan memasukkan command berikut. Akan muncul informasi dari service OpenVPN dengan pesan active (running)
sudo systemctl status openvpn-server@server.service
Langkah selanjutnya, kita akan meng-copy file client configuration yang telah dibuat tadi ke local device kita. File client ini nantinya akan kita gunakan untuk mengakses VPN lewat OpenVPN Client. Untuk melakukannya maka kita cukup memasukkan command berikut.
sudo cat /root/[nama-client].ovpn
Salin text file konfigurasi dari bagian client hingga bagian bawah </tls-crypt> dengan cara block text lalu tekan CTRL+C, pastikan tidak ada yang bagian yang tertinggal. Pastikan juga tidak ada spasi atau enter tambahan pada bagian bawah. Pada local device kita, buka notepad dan paste text client configuration tadi, lalu simpan dengan menggunakan nama [nama-client].ovpn.
Mengakses Network Cloud dengan OpenVPN Client
Selanjutnya, kita akan mencoba mengakses public-subnet dari local device kita melalui OpenVPN. Buka aplikasi OpenVPN GUI di local device kita. Pada bagian taskbar bawah akan muncul icon dari OpenVPN GUI. Klik kanan pada icon, lalu pilih Import file. Kemudian pilih file Client Configuration tadi yang berekstensi .ovpn.
Setelah melakukan import, maka buka kembali options di icon OpenVPN GUI dengan cara klik kanan pada icon, pilihan client yang berhasil diimport akan muncul pada bagian atas. Arahkan mouse pada nama client lalu pilih Connect.
Setelah menekan tombol Connect, maka akan muncul window yang menampilakn proses akses OpenVPN GUI.
Setelah koneksi berhasil, maka pada bagian icon OpenVPN GUI akan berubah menjadi warna hijau dan nama client akan dicentang yang menandakan bahwa kita berhasil melakukan koneksi melalui OpenVPN GUI.
Selamat, Anda berhasil mengakses network di dalam cloud menggunakan OpenVPN secara aman. Saat ini, komputer Anda seolah-olah sedang berada di dalam network cloud, dalam hal ini adalah public-subnet.
Mencoba Akses SSH ke Internal-instance
Untuk melakukan cek apakah komputer kita benar-benar sedang berada di dalam network cloud, maka kita dapat mencoba akses internal-instance. Seperti yang dijelaskan sebelumnya, karena firewall rule allow-ssh-internal yang dimiliki oleh internal-instance hanya mengizinkan akses SSH pada subnet yang sama, maka saat ini kita dapat mengaksesnya karena komputer kita sedang berada di dalam public-subnet.
Buka kembali aplikasi PuTTY, dan masukkan konfigurasi sama seperti sebelumnya. Perbedaannya adalah pada bagian Host name kita akan menggunakan internal IP dari internal-instance.
Jika telah sesuai, maka kita berhasil mengakses SSH pada internal-instance dari dalam network tanpa perlu membuka akses dari internet.
Kesimpulan
OpenVPN adalah salah satu Software open source yang dapat membantu kita untuk membuat koneksi VPN antara network di cloud dengan local device melalui jaringan internet secara aman dan terenkripsi. Dengan menggunakan VPN, kita dapat mengakses resources di dalam cloud di mana pun dan kapan pun kita berada. Selain itu, OpenVPN Client juga mudah untuk digunakan dibandingkan dengan bastion-host terutama jika kita harus memberikan akses ke network cloud bagi user yang tidak memiliki latar belakang IT.