Anda tentu sudah tidak asing dengan VPN. VPN di Indonesia umumnya dipakai untuk membuka situs website yang telah diblokir oleh regulator. Banyak juga kita temui penyedia layanan VPN gratis, baik untuk desktop maupun mobile. Namun tentu saja, karena gratis jadi tidak hanya kita yang menggunakan. Server VPN gratis tersebut tentu dipakai orang lain juga, akses server VPN terbagi-bagi sehingga tak heran jika ada yang mengatakan menggunakan VPN gratis itu lamban. Tapi bagaimana jika Anda dapat membuat server VPN yang bisa Anda gunakan sendiri tanpa harus berbagi dengan pengguna yang lain? Artikel ini akan berusaha menjawab pertanyaan tersebut.
Contents
Kenapa Membuat VPN Sendiri?
Mempunyai VPN sendiri artinya hanya kita sendiri yang menggunakannya, atau setidaknya kita juga bisa berbagi ke beberapa orang terbatas. Dengan memiliki server VPN sendiri maka kita punya akses ekslusif ke server, tidak dibagi-bagi, sehingga diyakini akan terasa lebih cepat dan stabil dibanding menggunakan VPN gratis yang ada di luar sana.
VPN Tidak Hanya untuk Membuka Situs yang diblokir
Perlu diketahui bahwa VPN tidak hanya digunakan untuk membuka situs terblokir, VPN bisa sangat bermanfaat untuk developer dalam beberapa kasus, diantaranya seperti:
- Membuat lingkungan aman untuk aplikasi yang berjalan di server. Apabila Anda memiliki aplikasi yang hanya boleh diakses oleh orang tertentu secara ekslusif, maka Anda bisa memanfaatkan VPN. Hanya orang yang tersambung ke VPN Anda yang dapat mengakses aplikasi Anda. Hal ini akan menambah keamanan dari aplikasi tersebut.
- Menyambungkan Host yang Berbeda Jaringan Menjadi Satu Jaringan. Katakanlah Anda memiliki server fisik atau komputer yang ingin Anda akses dari tempat yang jauh, tentu Anda tidak bisa langsung mengaksesnya karena sudah berbeda jaringan dan server fisik tersebut tidak memiliki IP publik yang bisa diakses dari internet. Maka VPN bisa menjadi solusi karena memungkinkan kita membuat sebuah jaringan virtual yang dapat menyambungkan host yang berbeda tersebut selama masing-masing host memiliki akses ke internet.
- Memungkinkan Anda untuk Memiliki IP Static. Beberapa sistem mungkin menerapkan IP Whitelist, yang artinya hanya IP yang diizinkan saja yang boleh mengakses sistem tersebut. Jika Anda sedang bekerja dengan sistem semacam itu, maka dengan menggunakan VPN Anda akan memiliki static, cukup daftarkan IP static Anda ke sistem IP Whitelist dan Anda tidak perlu kuatir IP Anda berubah yang dapat mengakibatkan akses ke sistem tersebut terganggu.
- Tentu masih banyak lagi skenario yang bisa kita kembangkan dari penggunaan VPN ini. Anda bisa eksplor sendiri jika ingin tahu lebih lanjut.
Bagaimana Bisa Gratis?
Untuk membuat VPN server, tentu Anda membutuhkan server. Supaya bisa gratis, maka Anda membutuhkan server yang gratis pula. Disini saya menggunakan layanan dari Oracle Cloud karena ada paket selalu gratis. Coba simak ulasan saya terkait server selalau gratis dari Oracle Cloud ini pada post sebelumnya.
Apabila Anda sudah memiliki server gratis dari Oracle Cloud, silakan lanjut pada tahap berikut.
Instalasi VPN Server pada Oracle Cloud
Persiapan
Aplikasi VPN server yang saya gunakan pada artikel ini adalah “OpenConnect”, jadi jika nanti server sudah siap, saya juga perlu menggunakan aplikasi client untuk OpenConnect. Oh iya, OS pada server yang saya gunakan adalah “Ubuntu 20.04 Server”. Selain itu Anda juga perlu memiliki domain yang mengarah ke server Anda. Bila Anda mencari penyedia domain gratis, coba cek situs website Freenom. Dalam artikel ini saya akan menggunakan subdomain vpn.tutorlokal.com, silakan ganti sesuai domain/subdomain milik Anda pada saat melakukan konfigurasi.
Install OpenConnect VPN Server
Silakan login ke server Anda lalu jalankan perintah berikut:
$ sudo apt update
$ sudo apt install ocserv
Setelah berhasil terinstall, coba cek status servicenya, pastikan sudah aktif berjalan.
$ sudo systemctl status ocserv
Install Let’s Encrypt Client (certbot)
Untuk mendapatkan versi certbot terbaru, kita perlu install certbot menggunakan snapd
, jadi pastikan server Anda sudah tersedia snapd
. Kemudian jalankan perintah berikut untuk memastikan Anda mendapatkan versi snapd
terbaru.
$ sudo snap install core; sudo snap refresh core
Sebelum memulai install cerbot terbaru, pastikan Anda sudah menghapus certbot yang mungkin sudah pernah terpasang sebelumnya di server.
$ sudo apt-get remove certbot
Jika sudah, sekarang saatnya install certbot terbaru menggunakan snapd
.
$ sudo snap install --classic certbot
Lalu jalankan perintah berikut untuk memastikan perintah certbot bisa dijalankan.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Cek versi certbot.
$ certbot --version
certbot 1.14.0
Install dan Konfigurasi Nginx
Pertama, install Nginx jika belum tersedia.
$ sudo apt install nginx
Kemudian buat file konfigurasi vhost nginx.
$ sudo nano /etc/nginx/conf.d/vpn.tutorlokal.com.conf
Lalu copy dan paste konten konfigurasi Nginx berikut.
server {
listen 80;
server_name vpn.tutorlokal.com;
root /var/www/ocserv/;
location ~ /.well-known/acme-challenge {
allow all;
}
}
Jangan lupa untuk menyimpan perubahan. Selanjutnya buatlah direktori berikut.
$ sudo mkdir -p /var/www/ocserv
$ sudo chown www-data:www-data /var/www/ocserv -R
Lalu reload konfigurasi Nginx.
$ sudo systemctl reload nginx
Setelah vhost sudah selesai dikonfigurasi, sekarang saatnya membuat sertifikat SSL menggunakan certbot.
$ sudo certbot certonly --webroot --agree-tos --email you@example.com -d vpn.tutorlokal.com -w /var/www/ocserv
Apabila Anda menemui certbot gagal mendapatkan sertifikat dan menampilkan pesan di bawah ini:
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: vpn.tutorlokal.com
Type: connection
Detail: Fetching
http://vpn.tutorlokal.com/.well-known/acme-challenge/munRKW4IhTEanIqnpj11K7YVFIPK2TGZaXqqjJYyELY:
Error getting validation data
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address. Additionally, please check that
your computer has a publicly routable IP address and that no
firewalls are preventing the server from communicating with the
client. If you're using the webroot plugin, you should also verify
that you are serving files from the webroot path you provided.
Maka kemungkinan port web server masih tertutup, misalnya pada server saya setelah saya check di https://www.ipfingerprints.com/portscan.php port 80 saat ini masih tertutup.
Kita harus membuka access port ini, pastikan port pada firewall di Oracle Cloud sudah diberikan akses buka.
Pastikan daftar port yang ingin Anda buka juga terdaftar disini, misalnya 443 untuk HTTPS. Apabila port yang ingin dibuka sudah terdaftar pada firewall di Oracle Cloud tersebut namun ketika dicek status portnya belum open, maka kemungkinan ada firewall internal atau pengaturan routing dalam server yang membatasi.
Coba periksa pengaturan routing dengan menggunakan perintah berikut:
$ sudo iptables --list --line-numbers
Lalu periksa output dari perintah tersebut, cari apakah ada keterangan REJECT pada baris-baris yang muncul.
Apabila dilihat pada hasil cek di atas, maka dapat dilihat ada keterangan REJECT pada Chain INPUT dan Chain FORWARD. Catat nomor baris pada masing-masing Chain, kita perlu menghapus baris tersebut dengan menyebutkan nomor barisnya.
Misal dalam kasus saya pada Chain INPUT baris REJECT berada pada nomor 6, maka untuk menghapusnya perintah yang saya gunakan adalah sebagai berikut:
$ sudo iptables -D INPUT 6
Begitu juga untuk Chain FORWARD sesuaikan dengan nomor yang tampil, dalam kasus saya ada pada nomor 1:
$ sudo iptables -D FORWARD 1
Lalu jalankan lagi perintah untuk cek pengaturan tadi untuk memastikan baris yang tadi kita hapus sudah hilang.
$ sudo iptables --list --line-numbers
Jika sudah hilang, maka simpan pengaturan tersebut karena ini tidak permanen dan dapat kembali semula pada saat server restart. Gunakan perintah berikut untuk menyimpan pengaturan:
$ sudo netfilter-persistent save
Sekarang periksa lagi port status apakah sudah open?
Apabila semua port yang ingin Anda buka sudah berstatus open, maka silakan ulang lagi perintah untuk membuat sertifikat yang tadi gagal.
sudo certbot certonly --webroot --agree-tos --email you@example.com -d vpn.tutorlokal.com -w /var/www/ocserv
Begitu perintah berhasil dijalankan, maka akan muncul pesan seperti berikut:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Requesting a certificate for vpn.tutorlokal.com
Performing the following challenges:
http-01 challenge for vpn.tutorlokal.com
Using the webroot path /var/www/ocserv for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/vpn.tutorlokal.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/vpn.tutorlokal.com/privkey.pem
Your certificate will expire on 2021-08-13. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again. To non-interactively renew *all* of your
certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Konfigurasi OpenConnect VPN Server
Edit file konfigurasi dengan menggunakan perintah berikut:
$ sudo nano /etc/ocserv/ocserv.conf
Berikut ringkasan baris-baris yang saya ganti:
- Tambahkan komentar pada baris berikut:
- Sebelum
auth = "pam[gid-min=1000]"
- Sesudah
- #
auth = "pam[gid-min=1000]"
- #
- Sebelum
- Lalu tambahkan di bawahnya baris berikut:
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
- Pastikan pengaturan tcp-port dan udp-port sesuai dengan yang Anda inginkan.
tcp-port = 443
udp-port = 443
- Rubah path sertifikat agar mengarah ke path sertifikat yang tadi sudah kita buat sebelumnya.
- Sebelum:
server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
server-key = /etc/ssl/private/ssl-cert-snakeoil.key
- Sesudah:
server-cert = /etc/letsencrypt/live/vpn.tutorlokal.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.tutorlokal.com/privkey.pem
- Sebelum:
- Anda dapat mengatur batasan untuk client yang boleh mengakses server VPN ini.
max-clients = 128
max-same-clients = 2
- Lalu rubah default domain sesuai dengan domain milik Anda sendiri.
default-domain = vpn.tutorlokal.com
- Anda dapat mengatur IP untuk jaringan VPN antara server dengan client Anda. Misalnya saya ingin jaringan antara server dengan client menggunakan IP 192.168.0.xxx maka pengaturannya akan seperti ini:
ipv4-network = 192.168.0.0
ipv4-netmask = 255.255.255.0
- Lalu cari dan hapus comment pada baris berikut:
- Sebelum
# tunnel-all-dns = true
- Sesudah
tunnel-all-dns = true
- Sebelum
- Kemudian Anda dapat mengatur sendiri DNS server yang ingin Anda gunakan.
dns = 8.8.8.8
dns = 1.1.1.1
- Lalu tambahkan comment pada semua parameter route.
- Sebelum
route = 10.0.0.0/8
route = 172.16.0.0/12
route = 192.168.0.0/16
- Sesudah
# route = 10.0.0.0/8
# route = 172.16.0.0/12
# route = 192.168.0.0/16
- Sebelum
Simpan perubahan yang telah Anda buat, lalu jalankan perintah berikut untuk restart service dari server VPN ini.
$ sudo systemctl restart ocserv
Buat Akun VPN
Supaya perangkat client Anda dapat mengakses VPN, maka perlu dibuatkan akun VPN. Jalankan perintah berikut untuk membuat akun VPN, misalnya dengan username john. Anda akan diminta memasukkan kata sandi untuk john.
$ sudo ocpasswd -c /etc/ocserv/ocpasswd john
Aktifkan IP Forwarding
Agar client VPN dapat mengakses internet dari server maka perlu mengaktifkan IP Forwarding. Jalankan perintah berikut:
$ sudo nano /etc/sysctl.conf
Tambahkan text berikut pada baris paling akhir dari file tersebut:
net.ipv4.ip_forward = 1
Simpan lalu terapkan perubahan tersebut dengan menjalankan perintah berikut:
$ sudo sysctl -p
Konfigurasi IP Masquerading pada Firewall
Install firewall dengan perintah berikut:
$ sudo apt install ufw
Buka akses untuk SSH:
$ sudo ufw allow 22/tcp
Lalu cari tahu nama network interface pada server Anda, misalnya dengan menggunakan perintah ifconfig
. Anda akan melihat tampilan seperti ini, nama network interface akan tertera disana. Dalam kasus saya, nama network interface-nya adalah ens3.
Kita akan memasukkan nama network interface ini dalam pengaturan, jalankan perintah berikut:
$ sudo nano /etc/ufw/before.rules
Tambahkan teks berikut pada akhir baris dari file tersebut:
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE
# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT
Jangan lupa untuk mengganti ens3 dengan nama network interface Anda sendiri jika berbeda dengan kasus saya.
Secara bawaan firewall akan mencegah adanya packet forwarding, oleh karena itu mari kita set agar dibolehkan. Masih di file yang sama tambahkan teks berikut tepat di bawah pengaturan terkait forwarding:
# allow forwarding for trusted network
-A ufw-before-forward -s 192.168.0.0/24 -j ACCEPT
-A ufw-before-forward -d 192.168.0.0/24 -j ACCEPT
Pastikan IP address yang tertera disitu telah Anda sesuaikan dengan pengaturan IP Anda sebelumnya.
Simpan perubahan lalu aktifkan ufw dengan perintah berikut:
$ sudo ufw enable
Lalu restart service ufw:
$ sudo systemctl restart ufw
Setelah itu, jika Anda melihat pengaturan POSTROUTING, maka akan tampil kurang lebih seperti gambar berikut:
$ sudo iptables -t nat -L POSTROUTING
Buka Port 443 pada Firewall Server
$ sudo ufw allow 443/tcp
$ sudo ufw allow 443/udp
Sampai disini, proses setup server VPN bisa dikatakan selesai. Setelah ini mari kita coba menghubungkan perangkat client ke server ini.
Menghubungkan Client ke VPN Server
Disini saya menggunakan Kubuntu 20.04 pada perangkat client, sebelumnya pastikan aplikasi VPN pada client sudah terpasang:
$ sudo apt install openconnect
Pada Kubuntu, kita dapat menggunakan network manager. Silakan buat konfigurasi koneksi VPN baru, pilih “Cisco AnyConnect Compatible VPN (openconnect)”
Masukkan nama koneksi VPN serta alamat domain server VPN Anda pada kolom Gateway:
Pada network manager akan muncul opsi koneksi baru yang sudah dibuat, silakan klik tombol Connect untuk menghubungkan client dengan server VPN.
Akan muncul window baru yang akan meminta Anda untuk memasukkan username dan password dari akun VPN yg tadi sudah kita buat. Namun sebelumnya klik tombol Connect terlebih dahulu (tombol dengan icon globe).
Seusai terhubung, untuk memastikan apakah sudah benar-benar berhasil, Anda dapat menguji dengan cara memeriksa IP publik Anda melalui website seperti https://whatismyipaddress.com. Jika berhasil maka IP Address yg muncul akan sama dengan IP Address dari server VPN Anda, dan lokasi yang terdeteksi akan sesuai dengan lokasi dimana server Anda berada.
Penutup
Membuat server VPN sangat mudah dan dengan Oracle Cloud Always Free kita bisa mendapatkan akses VPN secara gratis. Semoga artikel ini bermanfaat untuk Anda.
Referensi:
- https://www.linuxbabe.com/ubuntu/openconnect-vpn-server-ocserv-ubuntu-20-04-lets-encrypt
- https://stackoverflow.com/questions/54794217/opening-port-80-on-oracle-cloud-infrastructure-compute-node
[…] Untuk tahap instalasi certbot saya sudah pernah menulis pada artikel “Membuat Server VPN Sendiri Gratis di Oracle Cloud”, silakan buka sub-bab instalasi certbot. […]