VPN atau Virtual Private Network sudah menjadi hal yang sudah tidak lumayan tabu untuk awam. VPN singkatnya adalah sebuah jaringan privat yang bisa diakses menggunakan jaringan publik (internet).

Sebelumnya, mari kita mengingat kembali bagaimana kita bisa terhubung ke internet:

Pernah bermain game secara offline misal DoTA mode LAN (Local Area Network)? Bagaimana komputer 1 bisa terhubung dengan komputer 2? Jawabannya, via Router! Yang mana, menggunakan sebuah kabel bernama Kabel LAN—kayaknya.

Jika ada 1 atau lebih komputer yang terhubung ke jaringan yang sama, maka 1 sama lain bisa berkomunikasi, seperti internet. Jika jaringan tersebut privat (tidak bisa diakses oleh publik) maka jaringan tersebut biasa disebut LAN sebagaimana yang dulu pernah diajari ketika TK.

Setiap komputer yang terhubung ke jaringan, akan memiliki alamat yang disebut alamat IP atau Internet Protocol. Ya, karena untuk terhubung ke jaringan internet, kita menggunakan protokol TCP/IP, bukan?

Alamat IP pun sama, ada yang jenisnya privat (hanya bisa diakses oleh komputer yang saling terhubung) ada yang publik (ehm, the internet). Untuk mendapatkan alamat IP publik (seperti 172.104.167.90, yang mana adalah salah satu ip dari server gue) kita harus "membeli" nya ke APNIC misalnya yang mana adalah salah satu Internet Registry yang mengelola alamat IP untuk daerah Asia Pasifik.

Oke oke kita sedang tidak ingin membuat ISP, jadi cukup sampai sini aja penjelasannya. IP yang gue "punya" tersebut dikelola oleh Linode, sebuah perusahaan infrastruktur cloud.

Salah satu region Linode—dan yang paling dekat dengan Indonesia—adalah Singapore, dan ketika kita membeli menyewa server di Linode Singapore, maka kita memiliki "komputer" yang berjalan disana, plus mendapatkan alamat IP juga baik itu privat maupun publik.

Oke, kita sekarang memiliki server yang jauh disana. Bagaimana untuk bisa "menggunakan" server kita yang jauh disana tersebut? Biasanya, via SSH atau Secure Shell, sebuah protokol untuk komunikasi client-server dari jarak jauh dan dengan aman (koneksi ter-enkripsi).

Selain SSH, ada protokol lain seperti RFB (Remote Framebuffer) yang biasa digunakan untuk VNC (Virtual Network Computing) yang mana berkomunikasi secara remote via tampilan Graphical lewat Frame Buffer.

Tapi kita tidak akan membahas tentang RFB hahaha.

Lanjut, tentunya membutuhkan proses otentikasi untuk bisa menggunakan komputer, sebagaimana laptop kita ketika baru di boot yang harus memasukkan kata sandi.

Di SSH, otentikasi tersebut salah satunya via kata sandi juga.

Tapi server kita terhubung ke dunia internet, dan sebagaimana yang kita tau: Selalu ada "orang jahat" di dunia ini, prinsip yin-yang. Jika komputer kita yang berada di jaringan privat kemungkinan terkena "kejahatan nya" relatif kecil (kalau ga dari orang yang terhubung satu jaringan yang relatif sedikit, yaa dari maling), di dunia internet, relatif besar: Siapapun yang terhubung ke internet.

SIAPAPUN.

Ada ~4 milyar pengguna internet, yang artinya ada segitu juga yang bisa terhubung ke server lo.

Apakah menyeramkan? Tergantung.

Kamu punya rumah, di rumahmu ada pintu, bukan?

Mungkin setiap orang boleh memasuki toilet umum yang ada di rumahmu, yang mana terbuka & berada di tempat yang aman. Dan tidak semua orang yang boleh masuk ke tempat lain, misal ruang tamu.

Di dunia internet, pintu tersebut bernama Port. Port yang umum digunakan di internet adalah 80 (HTTP) dan 443 (HTTP+SSL). Singkatnya, jika kamu mengakses suatu website tanpa secara eksplisit menuliskan port nya berapa, misal jika menggunakan protokol HTTP yang mana berarti browser akan secara implisit ngasih tau ke alamat IP tujuan bahwa kamu ingin mengakses port 80.

Kita sedang tidak kuliah per-internet-an jadi cukup sampai sini aja penjelasan tersebut.

Satpam: Firewall

Semakin sedikit kemungkinan, maka semakin aman. Ini adalah prinsip dasar seputar Parkinson's law untuk konteks keamanan.

HTTP memiliki port 80, HTTPS 443, dan SSH yang standarnya adalah 22. Ada 3 pintu yang bisa digunakan "maling" untuk menyusup kerumahmu. Bagaimana cara membuatnya menjadi lebih aman disamping tidak membuka banyak port?

Salah satunya, dengan membatasi siapa saja yang boleh "masuk" ke daerah & rumahmu. Ya, pakai satpam.

Bagaimana satpam bisa tau kalau si A boleh dan si B gak boleh? Dengan kita kasih tau! Misal, yang boleh masuk ke rumah gue adalah cuma orang-orang yang pakai segway yang ada stiker e v i l f a c t o r y l a b s nya aja. Selainnya, jangan bolehin masuk.

Lalu, bagaimana ini bisa diterapkan di dunia internet?

Firewall!

Firewall bertindak sebagai satpam, dia mengamankan pintu-pintu yang ada dengan membatasi siapa saja yang boleh masuk ke daerah rumah kita.

Apakah satpam saja cukup? Tentu tidak.

Satpam tidak bisa menjangkau semua wilayah kita dalam waktu yang sama. Itulah salah satu alasan kita mengapa memiliki CCTV selain untuk menakut-nakuti: Untuk mengetahui siapa yang mau masuk, berdasarkan identitas, bukan kriteria (ingat si segwey tadi?)

CCTV: IPsec

Meskipun gak nyambung dengan perumpamaan, tapi mari kita ambil perumpamaan CCTV karena nanggung udah ngetik nyampe sini.

Anggap CCTV kita ini bisa mengidentifikasi orang dari wajah nya, jika orang tersebut tidak berada di "daftar yang boleh masuk" ke rumah kita, maka... jangan bolehin masuk.

Lalu, bagaimana CCTV tersebut diterapkan di dunia internet?

IPsec!

Yang mana, biasa digunakan di teknologi VPN yang akan kita bahas sedikit disini.

VPN at the glance

VPN singkatnya adalah hubungan antar komputer yang terjadi secara virtual.

Masih ingat LAN yang mana terjadi secara fisik via kabel LAN?

Untuk gambaran VPN, kira-kira seperti ini:

Gambar diatas menggambarkan bahwa komputer 1 dengan komputer 2 terhubung dengan jaringan privat (VPN) via jaringan publik (Internet).

Apakah gambaran diatas sama seperti hubungan SSH? Ya dan tidak.

Salah satunya, SSH (via tunneling) tidak didesain untuk melakukan "forwarding" terhadap setiap koneksi yang terjadi, meskipun sama-sama terhubung secara privat & aman.

SSH adalah tentang "mengkontrol" komputer kita secara jarak jauh, sedangkan VPN adalah tentang membuat jaringan privat yang diakses via jaringan publik.

Misal, bagaimana cara untuk bisa mengakses port 3030 (privat, bukan quad-zero route) yang ada di server gue dari komputer gue? Dengan melakukan port forward ketika SSH!

Nah, VPN pun kurang lebih seperti itu. Tapi, daripada melakukan port forwarding, di VPN kita melakukan forwarding untuk setiap koneksi, bukan hanya per-spesifik port.

Dalam keperluan seputar pekerjaan, tentu banyak manfaat nya (yang akan kita bahas di part 2), disini, kita akan spesifik bahas untuk keperluan personal.

Wireguard

Untuk membuat jaringan VPN, biasanya kita menggunakan program bernama OpenVPN yang mana open source dan sudah mature (sudah berumur sekitar 19 tahunan).

Tapi mengkonfigurasi OpenVPN lumayan ribet baik untuk di server maupun di client (peer). Untuk kebutuhan personal, biasanya kita menggunakan layanan pihak ketiga seperti NordVPN, ExpressVPN, dsb yang mana tinggal bayar & pakai.

Wireguard mungkin belum se-mature OpenVPN, tapi yang keren dari Wireguard ini adalah menjanjikan kecepatan & keamanan yang tidak kalah dari OpenVPN yang mana menjadi defacto dan status quo.

Dan juga, Linus (pembuat kernel) tertarik dengan Wireguard dan me-merge nya ke kernel yang mana hanya dia saja yang bisa melakukan "merge request" untuk setiap perubahan yang terjadi di repositori kernel.

Proses konfigurasi Wireguard pun relatif mudah, sangat mudah. Jika kamu sudah terbiasa mengkonfigurasi SSH, Wireguard kurang lebih cara kerjanya sama seperti itu :))

Konfigurasi server

Diasumsikan kamu menggunakan sistem operasi Ubuntu. Jika bukan, mungkin yang membedakan hanya package manager dan lokasi konfigurasi yang digunakan.

Pertama, install wireguard dengan perintah:

$ apt install wireguard

Jika kamu menggunakan Ubuntu versi < 19, tambahkan dahulu repository nya sebelum meng-install:

$ add-apt-repository ppa:wireguard/wireguard

Dan tentu saja harus menggunakan sudo.

Sekarang, kita konfigurasi wireguard server terlebih dahulu. Pertama, kita membuat private & public key yang mana digunakan untuk berkomunikasi antar klien-server.

Hampir sama seperti SSH, bukan? Yang mana melakukan proses otorisasi via public/private key.

$ wg genkey | tee server_privatekey | wg pubkey > server_publickey

Perintah diatas membuat 2 berkas server_privatekey dan server_publickey yang akan kita gunakan nanti.

Sekarang kita buat juga untuk client nya, biar lebih cepet.

$ wg genkey | tee client_privatekey | wg pubkey > client_publickey

Sekarang, kita akan membuat konfigurasinya. Wireguard adalah teknologi Layer 3 (Network) yang mana akan menggunakan network interface sendiri, yang mana jaringan tersebut berjenis overlay.

Buat file bernama wg0.conf di /etc/wireguard, lalu isi dengan ini:

$ mkdir -p /etc/wireguard
$ cat << EOF > /etc/wireguard/wg0.conf

[Interface]
PrivateKey = <server_privatekey>
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = <client_publickey>
AllowedIPs = 10.0.0.2/32

EOF

Kode diatas kurang lebih menjelaskan seperti ini:

  • Address adalah IP subnet yang akan digunakan di network interface nya Wireguard, disini gue pakai 10.0.0.x biar gampang diinget
  • ListenPort adalah port yang akan digunakan untuk berkomunikasi, 51820 adalah defaultnya
  • Untuk bagian peer, itu digunakan untuk berkomunikasi dengan komputer lain, yang mana salah alamat IP yang boleh digunakan untuk public key client tersebut (yang sudah kita buat tadi) adalah 10.0.0.2

Sekarang kita jalankan wireguard server nya dengan perintah berikut:

$ wg-quick up wg0

Yang mana wg0 adalah network interface untuk wireguard kita, dan membaca konfigurasi dari /etc/wireguard/wg0.conf kita.

Sekarang kita lihat apakah wireguard sudah berjalan dengan menjalankan perintah berikut:

$ wg wg0

Dan lihat network interface nya (wg0) dengan perintah berikut:

$ ifconfig wg0

wg0       Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.0.0.1  P-t-P:10.0.0.1  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP  MTU:1420  Metric:1
          RX packets:xxx errors:0 dropped:0 overruns:0 frame:0
          TX packets:xxx errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:xxx (xx.x XX)  TX bytes:xxx (xx.x XX)

Jika keluarannya kurang lebih seperti diatas, berarti sudah oke.

Konfigurasi Klien

Sebenernya konsep klien-server sepertinya kurang cocok, yang mana klien lebih cocok disebut sebagai "peer" ya kan? But whatever.

Sebelumnya kamu harus memiliki wireguard toolchain terlebih dahulu di komputer kamu. Untuk menginstall nya, bisa ambil referensi dari sini.

Jika kamu menggunakan mac (dan memilih menggunakan CLI daripada GUI), bisa gunakan brew dengan menginstall package bernama wireguard-tools

$ brew install wireguard-tools

Package tersebut menghasilkan dua executable binary yakni wg(8) dan wg-quick(8).

Sekarang kita buat konfigurasinya untuk klien, yang relatif lebih singkat! Konfigurasi tersebut—kalau di komputer gue (Catalina)—berada di /usr/local/etc/wireguard yang mana harusnya berlaku untuk sistem operasi apapun.

$ mkdir -p /usr/local/etc/wireguard
$ cat << EOF > /usr/local/etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.2
PrivateKey = <client_privatekey>

[Peer]
PublicKey = <server_publickey>
Endpoint = <server_ip>:51820
AllowedIPs = 10.0.0.1
PersistentKeepalive = 21

EOF

Yang mana penjelasan singkatnya kurang lebih seperti ini:

  • Address ingat kan bagian AllowedIPs yang sudah kita buat di server? Bagian ini menjelaskan kalau kita (klien) akan menggunakan alamat IP tersebut
  • Endpoint adalah "server" kita yang mana menggunakan kombinasi alamat ip (publik) dari server kita + port (defaultnya adalah 51820)
  • AllowedIPs adalah subnet dari jaringan wireguard kita kan?
  • PersistentKeepalive buat mastiin kalau router yang gue pake di laptop enggak matiin tunnel, dengan cara mengirim PING setiap 21 detik

Jika sudah, jalankan perintah seperti yang sebelumnya dilakukan juga di server (wg-quick up wg0) lalu jika melakukan ifconfig akan muncul network interface baru.

Oh iya jika kamu ingin menggunakan DNS server custom kamu (seperti yang ada ditulisan ini) kamu bisa tambahkan key DNS dengan nilai alamat IP yang ingin digunakan, baik dikonfigurasi di server ataupun di klien.

Bagaimana kita tau bahwa komputer-komputer kita sudah terhubung ke VPN yang kita buat ini? Dengan menjalankan perintah wg show di klien misalnya.

Bisa juga dengan mengirim PING ke IP subnet dari klien (ping 10.0.0.1), kalau enggak muncul host unreachable, berarti sudah terhubung ke VPN kita.

Atau bisa melakukan request via curl(1) ke ipaddress.sh.

$ curl ipaddress.sh
172.104.167.90 # alamat IP server gue

Jika yang muncul bukanlah alamat IP (publik) dari "server" yang kita gunakan, mungkin ada salah di konfigurasi :))

Keuntungan untuk personal

Bisa nonton Netflix tanpa ribet-ribet ngikutin tulisan ini?

Untuk personal, biasanya terkait privasi. Jika tidak menggunakan VPN, entitas yang tertarik dengan informasi pribadi kita akan mengetahui kalau alamat IP kita adalah 36.x.x.x misalnya, untuk pengguna indiehouse.

Dari alamat IP mereka bisa tau kita menggunakan ISP apa, lokasinya dimana, dan mengidentifikasi kita lebih jauh lagi (khususnya di level ISP). Dengan menggunakan VPN, yang terlihat adalah bahwa kita seakan-akan lokasi kita di singapur misalnya kalau pakai server yang ada disana.

Iya jadi seakan-akan kita twitteran dari data center yang berisik punya linode yang berada di singapur.

Karena singapur enggak nge-block Netflix (dan reddit dan pornhub), jadi kita bisa akses situs itu tanpa harus melihat halaman internetposesif!

Dan juga kalau lo misalnya melakukan hacking ke kominfo pakai perintah htop, lo jadi gak terlalu gampang keciduk karena ISP lo gak tau lo aslinya dimana.

Dan masih banyak lagi, termasuk hal-hal yang hanya bisa didapat sesuai negara.

Hasil speedtest gue lumayan memuaskan (untuk pelanggan miskin kayak gue yang pakai paket 5Mbps) dengan kondisi 5 perangkat yang selalu terhubung ke internet:

Yang mana kurang lebih gak beda jauh dengan tanpa menggunakan VPN alias seperti tidak menggunakan VPN padahal pakai! Latensi sebesar ~30ms terlalu kecil bahkan gue ngangkat kopi aja mungkin menghabiskan ~3 detik.

Keuntungan untuk non personal

Ini akan kita bahas detail nya di part 2!

Dan juga disini kita tidak membahas seputar iptables (firewall di level kernel) ataupun ufw (diatas iptables), tapi untuk kebutuhan personal (terlebih bukan untuk tujuan komersialisasi) gue rasa sudah cukup.

Help me to help you

Jika tertarik membuat "your own vpn server", pertama bisa menyewa server di Linode seharga $5/bulan. Ya, itu ada kode affiliasi nya :))

Dengan paket $5/bulan (nanode) gue bisa menjalankan docker (mode swarm), 8 container (app+db+amqp), dan termasuk si wireguard ini.

Jika mendapatkan kesulitan, bisa mention di twitter (@faultable) atau kirim pesan di telegram.

Penutup

Nikmati keuntungan VPN dengan state-of-the-art cryptography, yang bertujuan untuk membuat jaringan yang lebih cepat, lebih sederhana, dan lebih ringan, dari IPsec, tanpa harus pusing mengatur IPsec (ada yang pernah? ada? ada?).

Selain itu—untuk kebutuhan personal—silahkan nikmati internet yang lebih sehat dan lebih privat. Privacy is fundamental right of human being, dengan menggunakan jaringan publik (internet) bukan berarti hal-hal yang bersifat pribadi bisa dikonsumsi oleh non-pribadi.

Sekalipun lo bukan teroris, kriminal, ataupun buronon BNI.

Seperti, apakah ISP gue tau kalau gue: Fariz, laki-laki, domisili Bandung, berumur sekian, bahwasanya buka pornhub hari ini? Tentu tau, kalau tidak tau, yaa gak bakal di blok dong.

Apa pentingnya untuk mereka? Tidak ada. Tapi sebagaimana bisnis jual-beli data: Data akan menjadi penting, ketika dibuat menjadi penting.

Apa pentingnya data seputar "lo ke indiemaret sekeloa setiap jam 9 pagi, tiap hari minggu"? Sekarang, kalau lo punya data tersebut, dan ingin menggunakan data tersebut, lo bisa bobol pintu kamar gue disekitar jam 9 pagi sampai karena gue lagi gak di kamar, atau bisa minjem duit ke gue dengan grebek gue di indiemaret karena kalau di WA cuma di read.

Itu cuma gambaran, but you got the point.

Terakhir, gimana kalau kita tutup tulisan part ini dengan membaca box dibawah ini?

Terima kasih!