— sekitar 12 menit membaca

Wireguard di OpenBSD

Catatan ane tentang memasang Wireguard di OpenBSD, yang katanya mudah tapi cukup bikin pusing juga

Tutorial ini juga bisa diterapkan di FreeBSD, perbedaannya hanya penggunaan package manager untuk memasang paket - paket yang dibutuhkan saja.

Jika di OpenBSD mempergunakan pkg_add maka di FreeBSD memakai pkg.

Kata orang - orang kalo pakai BSD paling gampang di OpenBSD karena Wireguard sudah ada di dalam base, oke karena memang sudah diinstall OpenBSD bisa langsung lanjut. Akan tetapi, ternyata itu bohong. Semua sama saja, harus mulai dari nol (kayak di BSD lainnya). Mau gimana lagi nasi sudah jadi krupuk maka mau ga mau lanjut.

Catatan ini akan dibagi menjadi 2 bagian yaitu memasang Wireguard di sisi server (VPS) dan sisi client (macos).

Setup Wireguard di VPS #

Karena wg (binary dari wireguard) ternyata belum ada di dalam OpenBSD, maka perlu memasangnya secara manual. Sebelum itu ada beberapa hal yang perlu ane catat yaitu VPS ane sudah memakai OpenBSD 7.8 dengan spesifikasi 1vCPU - 1GB RAM - 25GB SSD dan akan login dengan user bukan root sehingga ane akan pakai doas untuk elevasi ke root.

$ doas pkg_add wireguard-tools

perintah ini akan memasang wireguard-tools yang akan menyediakan binari wg dan wg-quick. tapi ane akan pakai wg saja. wg-quick emang mantap untuk membuat akses wireguard secara cepat, namun ane ingin belajar jadi akan membangunnya dari nol.

Buat key #

Setelah terpasang, langkah selanjutnya adalah membuat direktori khusus yang akan berisi berkas konfigurasi dari wireguard. Ini opsional, berkas wireguard bisa saja ditaruh dimana terserah tapi ane ikuti dulu panduan yang sudah ada dan jamak. Di dalam direktori /etc/wireguard, ane akan buat 2 buah key yang diperlukan untuk authentication server wireguard nantinya.

$ doas mkdir -p /etc/wireguard
$ cd /etc/wireguard
$ doas wg genkey | doas tee private.key | doas wg pubkey > public.key
$ cat private.key
QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
$ cat public.key
dbXB+Cue2VpYBIjaTYneGgNglJHdgylriDkb014v6nI=

Catat hasil dari private.key dan public.key karena ini nanti penting untuk konfigurasi.

Buat konfigurasi untuk Wireguard #

Di OpenBSD ada 2 cara untuk mengatur interface wg0 yang pertama adalah mempergunakan konfigurasi resmi dari Wireguard dan yang kedua mempergunakan metode asli khas OpenBSD.

Kelebihan dari metode pertama adalah standar Wireguard bisa langsung diaplikasikan kalo migrasi ke OS yang lain, sedangkan yang kedua karena konfigurasi standar dari OpenBSD sehingga bagi yang sudah terbiasa akan menjadi mudah dan familiar

Cara pertama #

Masih di direktori /etc/wireguard, ane akan buat berkas konfigurasi wireguard yang akan digunakan untuk mengatur koneksi antara server dan client yaitu wg0.conf

$ doas vim wg0.conf
[Interface]
PrivateKey = QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
ListenPort = 51820

[Peer]
PublicKey = <kosongin dulu nanti diisi publickey dari klien>
AllowedIPs = 10.0.0.2/32

Perhatikan AllowedIPs memakai /32 yang artinya hanya punya range 1 IP saja. Ini penting agar bisa terhubung dengan baik, karena jika memakai class lainnya seperti /24 tidak akan bisa terhubung. Wireguard bingung menentukan point to point tunnel.

Untuk PrivateKey, diisi dengan isi dari berkas PrivateKey yang sudah dibuat sebelumnya (yang tadi sudah dicatat. Sudah dicatat kan?). Sedangkan PublicKey nanti diisi dengan publickey yang akan dibuat diklien.

untuk interface, buat file baru dengan nama hostname.wg0 di direktori /etc.

$ doas vim /etc/hostname.wg0
inet 10.0.0.1 255.255.255.0
!/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf
up

Perhatikan baris kode !/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf, perintah ini akan memanggil konfigurasi Wireguard di /etc/wireguard/wg0.conf dan akan membacanya saat interface wg0 diaktifkan.


Pengaturan Interface di FreeBSD bisa saja memakai cara yg sama di atas namun biasanya ada 2 cara lain yang bisa di pakai yaitu melalui wg0.conf dan rc.conf.

Dengan wg0.conf adalah menambahkan keterangan tentang IP (dan MTU) langsung ke dalam file wg0.conf sehingga menjadi seperti ini

[Interface]
Address = 10.0.0.1/24
MTU = 1420

Penulisan netmask (/24) ini sangat penting karena FreeBSD sejak versi 14.2 tidak mengijinkan penulisan IP tanpa netmask maka jika terlewat Wireguard akan menolak untuk start. Namun kadang kala konfigurasi netmask ini tiba - tiba hilang, bisa karena sistem atau service Wireguard reboot sehingga harus kembali menambahkan secara manual. Jika dirasa merepotkan maka mengatur hal ini di file rc.conf adalah pilihan yang lebih baik.

$ doas sysrc cloned_interfaces+="wg0"
$ doas sysrc ifconfig_wg0="inet 10.0.0.1/24 mtu 1420 up"

Jika pakai cara ini, maka konfigurasi Address dan MTU harus dihapus dari file wg0.conf.


Cara kedua #

Untuk cara yang kedua adalah membuat konfigurasi dengan metode tradisional OpenBSD. Untuk interface, buat file baru dengan nama hostname.wg0 di direktori /etc.

$ doas vim /etc/hostname.wg0
wgkey QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
wgport 51820
wgpeer <kosongin dulu nanti diisi publickey dari klien> wgaip 10.0.0.2/32
inet 10.0.0.1 255.255.255.0
up

Jika memakai cara yang ini tidak perlu membuat file konfigurasi /etc/wireguard/wg0.conf. Apapun cara yang dipilih, sementara biarin dulu seperti ini, ane akan atur wireguard di klien terlebih dahulu.

Catatan untuk FreeBSD #

Jika pakai #FreeBSD maka sebaiknya pakai cara yang pertama yaitu dengan membuat file konfigurasi /usr/local/etc/wireguard/wg0.conf. Isinya mirip dan prosesnya juga sama dengan OpenBSD.

Wireguard Client di macos #

Ane pakai aplikasi #WireGuard resmi dari Wireguard. Kemudian membuat dan mengatur tunnel kosong baru (lihat gambar).

wireguard add tunnel

Opsional tapi kadang penting

Untuk blok [Interface] kadang perlu memasukkan Address dari wgaip di konfigurasi (dalam hal ini 10.0.0.1/32)

Untuk block [Peer] sangat disarankan untuk menambahkan PersistentKeepalive = 25 untuk menjaga koneksi tetap terjaga/terhubung dengan baik.

Selain itu mengaktifkan Exclude Private IP's akan membuat sistem tetap bisa mengakses jaringan lokal (seperti NAS, LAN, dsb) split tunnel saat terhubung ke Wireguard. Mengaktifkan ini sangat direkomendasikan.

Wireguard sudah terhubung tapi tidak bisa akses situs tertentu?

Tersangkanya jelas MTU atau Maximum Transmission Unit.

Biasanya sistem akan mengatur MTU secara otomatis, namun untuk beberapa OS tidak mengaturnya di nilai yang sama. Jadi jika di VPS (host) sudah diatur secara manual (misalnya ke nilai 1392) maka di klien harus memakai MTU yang sama. Caranya adalah menambahkan MTU=1392 ke dalam blok [Interface].

Tapi bagaimana cara menentukan MTU yang pas untuk wireguard?

Ada aplikasi yang bagus untuk membantu menentukan MTU yang sesuai dan optimal, nama aplikasinya wire-seek.

Unduh saja aplikasi ini, sesuaikan dengan OS yang dipakai (ane sesuaikan dengan OS di klien yaitu MacOS). Kemudian jalankan di Terminal/CLI dengan perintah:

  
       ➜ ./wire-seek-darwin-arm64 --tunnel 10.0.0.1
       Wire-Seek: WireGuard MTU Optimizer
       Target: 10.0.0.1(10.0.0.1)
       Protocol: IPv4
       Discovering path MTU (range: 576-1500)...
       Results:
         Path MTU: 1500 bytes
         WireGuard MTU: 1500 bytes
       Add to your WireGuard config:
         MTU = 1500
    
    

Dengan catatan, perintah ini dijalankan saat klien sudah terhubung dengan server Wireguard. IP 10.0.0.1 adalah IP server Wireguard (bisa diganti dengan IP endpoint namun hapus flag --tunnel). Hasilnya adalah MTU dengan nilai 1500, nilai ini kemudian ane masukkan di file konfigurasi wg0.conf di server maupun di klien.

Namun banyak rekomendasi untuk mengurangi nilai MTU sebanyak 8 bytes untuk header, sehingga nilai MTU menjadi 1492. Namun ane memilih nilai MTU di 1420 karena di nilai ini saya tidak mengalami banyak masalah dalam membuka situs.

Simpan dan kembali ke pengaturan wireguard di VPS.

Finishing WireGuard di VPS #

Apapun pilihan jenis konfigurasi WireGuard, setelah mendapatkan public key dari klien (dalam hal ini DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=) maka bisa dimasukkan ke dalam wg0.conf atau di hostname.wg0 di bagian peer publickey.

Maka isian dari /etc/wireguard/wg0.conf akan seperti ini:

$ doas vim /etc/wireguard/wg0.conf
[Interface]
PrivateKey = QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
ListenPort = 51820

[Peer]
PublicKey = DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=
AllowedIPs = 10.0.0.2/32

atau /etc/hostname.wg0:

wgkey QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
wgport 51820
wgpeer DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w= wgaip 10.0.0.2/32
inet 10.0.0.1 255.255.255.0
up

Selanjutnya adalah mengatur aliran data untuk mengalihkan paket wireguard ke interface wg0.

$ doas sysctl net.inet.ip.forwarding=1
$ doas echo "net.inet.ip.forwarding=1" >> /etc/sysctl.conf

Tidak cukup ini saja, perlu juga mengatur firewall di pf.conf. Ane cukup pusing disini dan butuh waktu yang lama agar bisa berjalan.

$ doas vim /etc/pf.conf
# Set MTU
match on wg0 scrub (max-mss 1352)

# Wireguard
pass in on egress proto udp from any to any port 51820
pass in on wg0
pass out on egress
pass from 10.0.0.0/24 to any
match out on egress from 10.0.0.0/24 to any nat-to (egress)

# SSH
pass in quick on egress proto tcp from any to (egress) port 22

Tes firewall jika tidak ada masalah langsung aktifkan.

$ doas pfctl -nf /etc/pf.conf
$ doas pfctl -f /etc/pf.conf

Aktifkan wireguard network interface dan cek statusnya.

$ doas sh /etc/netstart wg0
$ doas wg show
interface: wg0
public key: dbXB+Cue2VpYBIjaTYneGgNglJHdgylriDkb014v6nI=
 private key: (hidden)
 listening port: 5

peer: DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=
  endpoint: 103.102.101.100:5976
  allowed ips: 10.0.0.2/32

di bagian peer tidak ada keterangan handshake menandakan bahwa klien belum terhubung. Hubungkan klien di aplikasi wireguard dan seharusnya di bagian peer menjadi seperti ini:

peer: DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=
  endpoint: 103.102.101.100:5976
  allowed ips: 10.0.0.2/32
  latest handshake: 10 seconds ago
  transfer: 1 MiB received, 2 Mib sent

kemudian cek akses internet di klien dan cek IP dengan mengunjungi situs ipleak seharusnya lokasi dan IPnya sudah sesuai dengan IP dan lokasi VPS.

ipleak

Update

Untuk menambahkan peer baru, sila mengulangi proses ini. Kemudian restart ulang interface wireguard, dan cek lagi dengan menjalankan perintah doas wg show. Jika setelah dicek masih ada peer yang lama atau yang baru dimasukkan tidak terlihat, maka coba untuk menghapus interface wg0 dan mengaktifkan ulang.


$ doas ifconfig wg0 destroy
$ doas sh /etc/netstart wg0
$ doas wg show

Seharusnya data peer sudah diperbarui.

Artikel Terkait

Unbound di OpenBSD

Unbound adalah DNS resolver caching recursive yang open-source, ringan, dan secure. Tapi dia punya kemampuan lain yaitu memblokir iklan yang menjengkelkan. Sempurna untuk digabung dengan Wireguard.

Killswitch #

Killswitch adalah fitur keamanan yang sekarang sepertinya sudah menjadi standar untuk layanan VPN. Fungsinya adalah memutus akses internet saat VPN terputus sehingga tidak ada kebocoroan (data leak) berupa IP, DNS, atau data lainnya yang terkait. Hampir semua aplikasi VPN sudah menyediakan fitur ini.

Namun karena ane buat VPN secara mandiri, maka ane hanya pakai aplikasi resmi dari wireguard yang sangat minimalis dan tidak banyak fitur tersedia termasuk killswitch. Karena MacOs sendiri adalah bagian dari keluarga BSD, maka tentu saja MacOs memiliki atau mempergunakan firewall PF, sehingga bisa dimanfaatkan untuk membuat mode killswitch sendiri.

Inti dari killswitch ini adalah memutus akses keluar masuk saat tidak sedang terhubung ke VPN, script pf sederhananya sebagai berikut

vpn_ip = '103.102.101.100'
vpn_port = '5128'

set skip on lo0

# block semua akses keluar
block drop out all

# ijinkan akses ke wireguard saja
pass out proto udp from any $vpn_ip to any port $vpn_port
pass on utun4 all

Saat diaktifkan perintah ini akan memblokir semua akses keluar kecuali akses ke wireguard dan akses ke interface utun4.

Di mac ane, akses wireguard mempergunakan interface utun4. Sesuaikan dengan interface yang digunakan oleh wireguard di sistem ente.

Cara pakainya adalah, saat VPN sudah terhubung, jalankan perintah berikut:

$ sudo pfctl -fa ~/.pf_killswitch.conf -e

Saat sudah tidak memakai VPN, pf ini harus dimatikan supaya tidak memblokir akses internet yang lain. Jalankan perintah berikut:

$ sudo pfctl -d

Jika punya pengaturan pf yang lain, maka jangan lupa aktifkan kembali pengaturan pf asli dari Macos dengan perintah berikut:

$ sudo pfctl -f /etc/pf.conf -e

Cukup merepotkan bukan? Tapi diluar sana tidak hanya ane yang repot, sehingga ada seseorang yang kemudian membuat script untuk memudahkan proses ini. Namanya killswitch dari github - https://vpn-kill-switch.com/. Cara pasangnya mudah sekali, dibantu oleh homebrew dan cara pakainya seperti ini

$ brew install killswitch
$ sudo killswitch -e
$ sudo killswitch -d

Sedangkan perintah killswitch sendiri akan menghasilkan informasi terkait interface tersedia dan public IP address yang digunakan oleh VPN.

$ sudo killswitch
Interface  MAC address         IP
en0        76:61:a8:f1:ex:1O   172.20.10.2/16
utun4                          10.0.0.2

Public IP address: 103.102.101.100
PEER IP address:   <nil>

To enable the kill switch run: sudo killswitch -e
To disable: sudo killswitch -d

seperti contoh di atas adalah informasi setelah VPN terhubung, masalahnya adalah di PEER IP address: <nil> ini karena killswitch tidak bisa menemukan IP dari Endpoint VPN, bug yang memang muncul jika pakai MacOS. Sehingga saat killswitch dijalankan dia akan bikin semua akses internet terblokir meski sudah terhubung ke VPN.

Jadi agar killswitch bisa mengerti PEER IP address, maka perlu menambahkan flag -ip untuk menentukan IP address dari Endpoint VPN.

$ sudo killswitch -e -ip 103.102.101.100
$ sudo killswitch
Interface  MAC address         IP
en0        76:61:a8:f1:ex:1O   172.20.10.2/16
utun4                          10.0.0.2

Public IP address: 103.102.101.100
PEER IP address:   103.102.101.100

To enable the kill switch run: sudo killswitch -e
To disable: sudo killswitch -d

dan dengan ini killswitch akan menandai akses ke IP Address VPN dan mengaktifkan pf, jika VPN terputus maka killswitch akan memblokir semua akses internet yang meningkatkan keamanan dan privasi pengguna.Jangan lupa mematikan killswitch jika sedang tidak memakai VPN, agar tidak repot ketik perintah manual di terminal gunakan Shortcuts app untuk membuat shortcut.

Mempergunakan Shortcuts app memiliki satu masalah yaitu akan membuka terminal setiap kali shortcut dijalankan. Jika pernah dijalankan misalnya 100 kali, maka di perintah ke 101 akan membuka terminal sebanyak 100 jendela. Ini sangat menganggu meski nantinya jendela - jendela tersebut akan menghilang setelah perintah selesai diproses.

Untuk itu ane gunakan cara lain yaitu dengan mempergunakan aplikasi kecil lainnya yang bernama Hammerspoon. Setelah terpasang, cara pengaturannya adalah dengan membuat file ~/.hammerspoon/init.lua. Iya Hammerspoon pakai Lua untuk pengaturannya, memang sedikit repot tapi kalo paham Lua maka ini membuat Hammerspoon sangat fleksibel.

local wg_server = "103.102.101.100"
local anybarPort = "1738"

local function updateAnyBar(color)
    hs.execute('echo -n "' .. color .. '" | nc -4u -w0 localhost ' .. anybarPort, true)
end

local function sudoPoes(command, successColor, successMsg)
    local _, status = hs.execute("sudo " .. command, true)
    if status then
        updateAnyBar(successColor)
        hs.alert.show(successMsg, 2)
    end
end

-- Hotkeys
hs.hotkey.bind({"alt", "cmd"}, "9", function()
    sudoPoes("killswitch -e -ip " .. wg_server, "red", "Killswitch Aktif")
end)

hs.hotkey.bind({"alt", "cmd"}, "0", function()
    sudoPoes("killswitch -d", "green", "Killswitch Berhenti")
end)

Setelah disimpan dan reload config, maka jika menekan tombol ⌥ + ⌘ + 9 akan mengaktifkan perintah pengaktifan killswitch, setelah perintah aktif maka Hammerspoon juga akan mengirimkan sinyal ke AnyBar sebagai indikator di menubar dengan warna merah saat aktif dan hijau saat tidak aktif.

Scripts Hammerspoon di atas, khusus untuk aktifkan killswitch hanya bisa dijalankan saat wireguard sudah tersambung. Jika belum maka tidak akan menghasilkan apa - apa karena ane set IP wireguard langsung hard coded di dalam scripts. Peningkatan scripts ke depannya mungkin saat ⌥ + ⌘ + 9 ditekan maka secara otomatis memeriksa apakah wireguard sudah aktif atau belum. Jika sudah maka langsung aktifkan killswitch namun jika belum maka harus hubungkan wireguard terlebih dahulu.

Tentu saja AnyBar ini opsional, boleh tidak dipakai namun ane pasang karena membantu memberikan visual apakah killswitch sedang aktif atau tidak.

Dengan aplikasi #

Lulu Block Mode, harus manual mengakses menu ini untuk mengaktifkan block mode

Ada beberapa aplikasi yang bisa digunakan sebagai alternatif killswitch seperti Little Snitch atau Lulu. Dari kedua ini Little Snitch lebih bagus dan mudah namun memang aplikasi berbayar, sedangkan Lulu gratis namun kurang fleksibel dan masih memerlukan campur tangan user (manual aktifkan rules.)

Aplikasi gratis lain yang bisa dipakai adalah Mirham KillSwitch, yang bisa diunduh dari sini. Aplikasi ini akan menaruh ikon di menubar dan tinggal klik untuk memakainya.


Artikel terkait #openbsd

Wireguard di OpenBSD

Catatan ane tentang memasang Wireguard di OpenBSD, yang katanya mudah tapi cukup bikin pusing juga

Menginstall OpenBSD di VPS berbasis Linux

Provider tidak menyediakan OS OpenBSD dan atau ingin menginstall sendiri?


dari Fediverse

Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-reply di toot ini

Belum ada komentar dari fediverse

kembali ke atas