Pada 15 Juni 2021 kemarin gue membeli router yang oke banget, doi menggunakan sistem operasi OpenWRT dan juga “menjadikan” privasi dan keamanan sebagai fitur utama (built-in support VPN & DNS encryption).
Pada dasarnya *router *hanyalah sesuatu yang bertugas untuk meneruskan & merutekan paket, dan sudah gue bahas sedikit di edgy’s frontline newsletter yang di isu paling pertama. Lalu gue kepikiran gimana kalau Raspberry Pi gue dijadiin router? Spesifikasi Raspberry Pi gue gak terlalu sampah banget: armv7, 4 core CPU dan RAM 4G, dan gue ingin ber-eksplorasi lebih dalam ke network engineering.
Percobaan pertama adalah dengan menjadikan Raspberry Pi (yang akan gue singkat menjadi raspi) bekerja sebagaimana *router *pada umumnya, yang berarti menjadi:
- DHCP server untuk memberikan alamat IP secara dinamis ke klien
- DNS (stub) resolver untuk menjawab DNS query oleh klien
- Penerus paket ke gateway (raspi gue terhubung ke WAN dan ada 2 router dibelakangnya)
Berdasarkan 3 poin diatas, minimalnya ada 3 program yang harus berjalan di raspi gue:
hostapd(8)
untuk membuat Access Point (AP) biar *devices *gue bisa terhubung secara wirelessdnsmasq(8)
untuk memberikan alamat IP ke klien sekaligus untuk menjawab *DNS queries *jugaiptables(8)
untuk mengatur paket yang masuk dan keluar. Biasanya ini sudah terpasang di sistem operasi
Dan seperti biasa, berikut ilustrasinya:
Dibelakang 192.168.88.0/24 masih ada 1 router lagi sebelum nyambung langsung ke ISP, cuman yaudalaya
Subnet yang gue pilih adalah 10.3.141.0/24 karena kenapa tidak dan gue tidak menggunakan dnsmasq(8)
melainkan AdGuardHome karena dia juga bisa bertindak sebagai DHCP server. Serta, kalau gue pakai *dnsmasq, *dns queries diforward dari router ke… router. Jadi, kalau si 10.3.141.6 pakai *nameserver router, si AdGuardHome taunya kalau yang melakukan query *itu adalah si router itu sendiri bukan dari klien.
Nah, karena gue ingin tau juga siapa melakukan *query *kemana, jadi gue jadikan AdGuardHome sebagai DHCP server. Setting DHCP server gue Oh iya, si raspi gue untuk yang ini menggunakan sistem operasi Raspian karena FreeBSD 13.0 untuk di armv7 tidak mendukung *driver *Wi-Fi yang digunakan di raspi gue.
Driver untuk Wi-Fi gue adalah wlan0
dan punya *static ip *10.3.141.1.
Gue kurang yakin apakah set *gateway IP *diatas menjadi 10.3.141.1 adalah hal yang benar atau salah, tapi bagaimanapun gue pakai iptables(8)
juga untuk meneruskan paket dari wlan0
ke eth0
.
Untuk memulai, silahkan pasang AdGuardHome di raspi anda, kalau cara gue biasanya gini:
curl -JOL [<link>](https://github.com/AdguardTeam/AdGuardHome/releases)
tar -xzvf <nama>
sudo mv AdGuardHome/AdGuardHome /usr/local/bin
sudo /usr/local/bin/AdGuardHome -s install
Lalu akses port 3000, dan jalankan *setup *seperti biasa (next next next next).
Setting Access Point
Sekarang kita ke bagian setting AP menggunakan hostapd(8)
. Berkas konfigurasinya berada di /etc/hostapd/hostapd.conf
dan konfigurasi minimalnya seperti ini:
auth_algs=1
wpa_key_mgmt=WPA-PSK
beacon_int=100
ssid=<nama_wifi>
channel=1
hw_mode=g
ieee80211n=0
wpa_passphrase=<password_wifi>
interface=wlan0
wpa=2
wpa_pairwise=CCMP
country_code=ID
ignore_broadcast_ssid=0
Apakah gue tau semua maksud dari konfigurasi diatas? Tentu tidak, tapi bukankah kita memiliki mesin pencari? Anyway, intinya konfigurasi diatas untuk setting biar si raspi kita *brodcast *sinyal Wi-Fi yang menggunakan autentikasi via WPA-PSK.
Dan berikut tampilannya ketika sudah tersambung: Tentu saja signal stength excellent karena router gue disamping pisan Karena gue pakai AdGuardHome sebagai DHCP server, kita bisa tau perangkat apa aja yang tersambung berikut dengan MAC Address dan alamat IP nya: Daftar klien yang tersambung ke raspi gue Gue pakai DHCP static lease karena 2 alasan:
- Pengguna router ini umumnya cuma gue
- Fitur “Private Address” nya iOS/iPadOS somehow ngeganggu, yang mana enggak expose *hostname *dan MAC Address asli perangkat gue (which is good) sedangkan gue butuh itu for the sake of a e s t h e t i c ✨ di dasbor AdGuardHome gue
Setelah si raspi sudah bisa ngasih alamat IP & melakukan DNS query, sekarang waktunya membuatnya bisa meneruskan paket. Seharusnya ini udah berjalan *out of the box *but just in case enggak berjalan, bisa cek peraturan di Firewall ataupun memastikan bahwa nilai net.ipv4.ip_forward
adalah 1
di /etc/sysctl.conf
.
Install ntop
Meskipun untuk mengetahui “siapa mengontak siapa” secara teknis sudah bisa dilakukan di level DNS, tapi gue butuh informasi “siapa mengontak apa”.
Dan untuk mengetahui itu gue butuh bantuan ntopng(8)
yang exactly bekerja sebagai “traffic analyzer”. Pikirkan seperti top(1)
tapi untuk jaringan.
Untuk pemasangan ntopng(8)
bisa diunduh melalui situsnya disini. Dan berikut salah satu tampilannya:
Analisa trafik per aplikasi
Disitu gue bisa mengetahui perangkat-perangkat gue ini menghubungi siapa aja (Amazon, Twitter, Spotify, dkk) dan apa aja (SSH, mDNS, DNS, dkk) **plus **dengan kategorinya (Tracker/Ads, Fun, Acceptable, dkk).
Karena ntop adalah Traffic Analyzer, jadi dia pun menganalisa paket apa yang sekiranya dianggap berbahaya ataupun butuh perhatian. Misal ini, gue dapet alert kalau ada paket yang diduga “malicious” dengan kategori Suspicious DGA: gue rasa karena TLD nya .xyz Kita bisa setting “score anomaly” sesuai dengan selera kita sendiri.
Proses instalasi ntopng(8)
relatif sederhana, dan satu-satunya konfigurasi yang gue setting sendiri hanyalah agar listen port ke 3003.
What’s next?
Tentu saja tunnel!
DNS queries yang ada di perangkat-perangkat gue dikirimkan melalui *encrypted protocol *yakni HTTPS, TLS, dan QUIC (yang dipilih randomly pakai RR) di AdGuardHome dengan edgyDNS sebagai upstream DNS.
Setelah itu gue akan membuat IPv6 tunnel via TunnelBroker nya HE biar router gue mendukung IPv6.
Lalu gue buat traffic internet gue di proxy ke edgyPROXY dan menggunakan QUIC sebagai transport protocol.
Berdasarkan keterbatasan kepengetahuan gue, jika melihat kebutuhan gue diatas, paket yang di-expose ke router dibelakang gue (dan router ISP tentunya) gue rasa bakal encrypted semua:
- DoH, DoT dan DoQ untuk DNS queries
- Proxy over QUIC untuk Web traffic (goodbye SNI leak, I guess?)
Dan tentu saja akan terus gue monitor untuk mengetahui mana aja yang miss.
VPN?
Di setup seperti ini gue rasa gue belum butuh full tunnel via VPN.
Pertama karena gue bisa kontrol secara penuh untuk mengatur DNS dan HTTP traffic dan yang kedua karena bisa gue kontrol, berarti gue bisa milih untuk pakai encrypted transport protocol hahaha.
Beda ketika gue pakai routernya GL-inet yang memiliki spek yang minimum. Dia bisa enkripsi paket DNS (built-in support DoT via 1.1.1.1 nya Cloudflare dan NextDNS) tapi gak bisa buat tunnel HTTP packet melalui transport protocol yang aman.
Kalau gue lagi bekerja diluar rumah (fyi gue udah ~2 minggu gak keluar rumah, dan itu sebuah prestasi untuk gue haha) tentu gue akan pakai si router GL-inet karena portable dan juga tunnel ke VPN server gue selalu tersambung.
Jadi gue gak perlu cabut-pasang si router itu lagi ketika keluar rumah sambil membiarkan si raspi gak mendapatkan akses ke internet hahaha.
Mengapa menjadikan raspi sebagai router?
Because why not?
Because we can?
Anything!
Sederhananya, apa yang bisa gue lihat adalah apa yang bisa dilihat oleh siapapun juga (ISP misalnya) dan gue tidak ingin siapapun tersebut mengetahui beberapa hal yang memang tidak ingin gue bagikan (seperti paket untuk DNS & HTTP/S misalnya).
It’s fine ISP mengetahui gue berkomunikasi dengan [2001:470:ed00::420]:6969 melalui protokol QUIC, tapi untuk urusan kalau ISP tau gue mengakses pornhub.com, sorry, big no.
Mungkin gue berlebihan, atau tingkat insecurity gue adalah paranoid.
Tapi at least gue sudah mengetahui threat model gue, dan pendekatan yang gue lakukan adalah hal-hal yang harus gue pilih untuk threat model yang sudah gue pikirkan tersebut.
Dan yang terakhir sebagai penutup, I’m just having fun!