140 lines
9.3 KiB
Markdown
140 lines
9.3 KiB
Markdown
|
---
|
||
|
title: Menjadikan Raspberry Pi sebagai router
|
||
|
tags:
|
||
|
- blog
|
||
|
slug: menjadikan-raspberry-pi-sebagai-router
|
||
|
date: 2021-07-07T04:54:53.000Z
|
||
|
date_updated: 2021-07-07T04:54:53.000Z
|
||
|
---
|
||
|
|
||
|
Pada [15 Juni 2021](https://s3.rizaldy.club/rizaldy-club-ghost/menjajal-gl-mt300n-v2-mini-smart-router/) 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](https://edgy.substack.com/p/deep-packet-fucking-inspection) 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 *wireless*
|
||
|
- `dnsmasq(8)` untuk memberikan alamat IP ke klien sekaligus untuk menjawab *DNS queries *juga
|
||
|
- `iptables(8)` untuk mengatur paket yang masuk dan keluar. Biasanya ini sudah terpasang di sistem operasi
|
||
|
|
||
|
Dan seperti biasa, berikut ilustrasinya:
|
||
|
![](https://s3.rizaldy.club/rizaldy-club-ghost/content/images/2021/07/Untitled-2021-07-05-0019.png)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](https://github.com/AdguardTeam/AdGuardHome) karena dia juga bisa bertindak sebagai [DHCP server](https://github.com/AdguardTeam/AdGuardHome/wiki/DHCP). 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.
|
||
|
![](https://s3.rizaldy.club/rizaldy-club-ghost/content/images/2021/07/Screenshot-from-2021-07-05-00-38-04.png)Setting DHCP server gue
|
||
|
Oh iya, si raspi gue untuk yang ini menggunakan sistem operasi [Raspian](https://www.raspbian.org/) 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:
|
||
|
![](https://s3.rizaldy.club/rizaldy-club-ghost/content/images/2021/07/Screenshot-from-2021-07-06-21-18-01.png)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:
|
||
|
![](https://s3.rizaldy.club/rizaldy-club-ghost/content/images/2021/07/Screenshot-from-2021-07-06-21-25-34.png)Daftar klien yang tersambung ke raspi gue
|
||
|
Gue pakai DHCP static lease karena 2 alasan:
|
||
|
|
||
|
1. Pengguna router ini umumnya cuma gue
|
||
|
2. 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.](https://www.ntop.org/get-started/download/) Dan berikut salah satu tampilannya:
|
||
|
![](https://s3.rizaldy.club/rizaldy-club-ghost/content/images/2021/07/Screenshot-from-2021-07-06-21-45-04.png)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](https://en.wikipedia.org/wiki/Domain_generation_algorithm):
|
||
|
![](https://s3.rizaldy.club/rizaldy-club-ghost/content/images/2021/07/Screenshot-from-2021-07-06-21-50-55.png)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](https://edgy.network/dns) sebagai upstream DNS.
|
||
|
|
||
|
Setelah itu gue akan membuat IPv6 tunnel via [TunnelBroker](https://tunnelbroker.net/) nya HE biar router gue mendukung IPv6.
|
||
|
|
||
|
Lalu gue buat traffic internet gue di proxy ke [edgyPROXY](https://edgy.network/proxy) 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](https://s3.rizaldy.club/rizaldy-club-ghost/menjajal-gl-mt300n-v2-mini-smart-router/) 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!
|