Menggunakan Pi-hole tanpa Raspberry Pi

karena mengapa tidak?

Menggunakan Pi-hole tanpa Raspberry Pi

Sudah lama menggunakan DNSCrypt sebagai solusi gue untuk menggunakan DoH (DNS Over HTTPS) dan sudah banyak menulis tentang itu di blog ini, silahkan berjalan-jalan ke tulisan gue yang lain yang sekiranya ngebahas tentang internet :))

Oke, gue seneng menggunakan DNSCrypt dan enggak ada masalah dengan itu. Sampai gue buat service di mac gue (via launchctl) biar setiap laptop gue booting (tiap 40 hari), itu dnscrypt langsung berjalan.

Juga, menggunakan DNSCrypt karena tidak punya Raspberry Pi, karena Pi-hole sudah menjadi perhatian sejak lama!

Dan mungkin sekarang adalah waktu yang tepat untuk mengganti DNSCrypt gue, dengan menggunakan Pi-hole.

Containerization

Jika itu bisa berjalan di mesin X, seharusnya bisa berjalan juga di docker runtime!

Pi-hole dikhususkan untuk berjalan di Raspberry Pi, yang biasanya dijadikan sebagai home server oleh sebagian orang, termasuk dijadikan DNS server juga.

Mari kita persingkat tulisan ini, dengan ya, langsung menuju ke implementasi.

Beruntungnya, Pi-hole menyediakan docker image yang mana menggunakan Alpine sebagai base image nya, yang berarti bisa diasumsikan memiliki ukuran yang lebih ringan.

Disini kita akan mulai menjalankan Pi-hole, dan sekaligus akan ditambahkan dengan menjalankan layanan DoH juga (because why not?).

Provision Pi-hole

Pertama, pull image dari pihole/pihole, silahkan gunakan versi latest bila tidak ingin ribet.

$ docker pull pihole/pihole:latest

Tunggu beberapa saat, harusnya ga sampai 5 menit (berukuran ~295M).

Sekarang jalankan Pi-hole, ada beberapa yang perlu diperhatikan:

Pertama, port 80 (TCP) & 53 (TCP & UDP) digunakan oleh Pi-hole. Port 80 digunakan untuk mengakses dashboard nya dan 53 digunakan... untuk berkomunikasi dengan sistem DNS, bukan?

Jika kamu sering menggunakan port 80 di local kamu, kamu bisa menggunakan port lain di pi-hole atau bisa menggunakan reverse proxy untuk mengaturnya.

Gue lebih memilih pakai port 80, karena gue jarang menggunakan port itu di local.

Konfigurasi minimal untuk mulai menjalankan Pi-hole adalah seperti ini:

$ docker run -p 53:53/tcp -p 53:53/udp -p 80:80 --dns=1.1.1.1 pihole/pihole:latest

Yang mana kita memberitahu docker untuk menggunakan custom DNS 1.1.1.1 (dari Cloudflare). Lalu tinggal arahkan komputer kamu untuk menggunakan DNS dari 127.0.0.1.

Kalau di mac, perintahnya adalah seperti ini (agar bisa di automasi):

networksetup -setdnsservers Wi-Fi 127.0.0.1

Ya kita pakai Wi-Fi karena mac gak punya port LAN, kan?

Harusnya sudah bisa berjalan hanya untuk testing, sekarang mari kita lanjut.

Persistence thing

Kita gak mau kan setiap jalanin Pi-hole ini kita harus mulai dari awal (download domain blacklist contohnya), konfigurasi yang sudah kita lakukan hilang, dsb. Kita butuh kasih tau Docker untuk menyimpan hal-hal tersebut di komputer kita juga, bukan cuma di container.

Untuk itu, kita perlu mounting /etc/pihole dan /dnsmasq.d ke container yang menjalankan pihole kita ini.

Sederhana, tinggal lakukan -v seperti biasa di docker run dan silahkan mapping menggunakan format /some/local/dir:/etc/pihole misalnya.

Dibawah akan kita buat ini menjadi lebih mudah via docker-compose.

DNS Over HTTPS

Gue pecinta DoH, meskipun banyak yang kontra entah karena alasan apapun itu, silahkan googling sendiri.

DoH membuat query DNS gue enggak bisa dilihat, khususnya oleh ISP.

Pi-hole ini kan bertindak sebagai DNS server, dia hanya bertugas untuk memberikan response dari query DNS yang mana akan memberikan alamat IP entah itu yang kita minat record A ataupun CNAME.

Silahkan baca-baca ini jika belum tau tentang bagaimana DNS bekerja.

Sayangnya, ISP disini bisa "meracuni" dns query kita dengan alasan apapun itu. Misal, ISP yang gue pakai nge-block Reddit, jadi ketika gue pengen coba akses reddit, bukannya ngasih alamat IP nya si reddit malah ngasih ini:

Demo diatas gue menggunakan DNS server nya cloudflare, buat konten aja. Yang harusnya ngasih alamat IP nya si Reddit, malah ngasih alamat IP nya si ehm.

Nah, Pi-hole ini kan ngejualnya sebagai "Ads & Trackers Blocker" di level DNS ya, dengan cara bertugas sebagai DNS Server. domain-domain yang sekiranya cocok untuk di block (seperti api.segment.io misalnya) akan di block. Jika kita menggunakan Ads Blocker di browser, blocking tersebut hanya berada di browser.

Tidak di terminal, aplikasi native, ataupun yang lain.

Disinilah Pi-hole membantu. Meskipun lo menggunakan Twitter for Mac misalnya, hal-hal terkait tracking (dan iklan) akan di block oleh Pi-hole.

Tapi sayangnya Pi-hole (mungkin) di desain bukan sebagai DoH client, maka dari itu kita butuh cloudflared sebagai Upstream DNS yang mana proses dns query yang dilakukan via HTTPS.

Sehingga ISP tidak bisa mengetahui (dan nge-block) website apa yang kita kunjungi.

Kita akan menggunakan docker image dari crazy-max/docker-cloudflared, yang mana menggunakan Alpine juga sehingga memiliki ukuran ~66M).

Jadi flow nya, Pi-hole akan melakukan dns query via cloudflared tersebut, yang mana dns query tersebut dilakukan via HTTPS ke layanan DoH nya Cloudflare.

Konfigurasi minimal untuk menjalankan ini adalah:

docker run cloudflared \
  -p 5053:5053/udp \
  -p 49312:49312 \
  crazymax/cloudflared:latest

Untuk test di local, kita bisa menggunakan dig seperti biasa:

$ dig reddit.com @127.0.0.1 -p 5053

Yang mana port 5053 tersebut adalah mengarah ke DoH proxy server nya cloudflared.

Menyatukan Pi-hole dengan cloudflared

Pertama, kita harus membuat container kita memiliki alamat IP yang fixed. Disini kita akan membuat jaringan baru dengan mode bridge dan menggunakan subnet 10.0.0.0/29 biar lebih mudah dihafal.

Kedua, container untuk cloudflared akan memiliki alamat IP 10.0.0.2 dan si Pi-hole kita memiliki alamat IP 10.0.0.3.

Sekarang mari kita buat docker-compose.yml nya agar hidup kita menjadi lebih mudah:

version: "3"

services:
  cloudflared:
    restart: unless-stopped
    image: crazymax/cloudflared:latest
    networks:
      pihole:
        ipv4_address: 10.0.0.2
    environment:
      - TZ=Asia/Jakarta

  pihole:
    restart: unless-stopped
    image: pihole/pihole:latest
    networks:
      pihole:
        ipv4_address: 10.0.0.3
    dns:
      - 127.0.0.1
    ports:
      - "80:80/tcp"
      - "53:53/tcp"
      - "53:53/udp"
    environment:
      - ServerIP=10.0.0.3
      - TZ=Asia/Jakarta
      - DNS1="10.0.0.2#5053"
      - DNS2=""
    volumes:
      - "~/Warehouse/pihole:/etc/pihole/"
      - "~/Warehouse/dnsmasq.d:/etc/dnsmasq.d/"

networks:
  pihole:
    driver: bridge
    ipam:
     config:
       - subnet: 10.0.0.0/29

Silahkan sesuaikan mapping dari Warehouse dengan pilihamu sendiri. Btw direktori Warehouse gue itu berisi data-data terkait redis, postgres, cockroach, mongo dan kawan-kawan yang digunakan untuk development.

Lanjut, disitu kita memberitahu container untuk menggunakan timezone Asia/Jakarta, jika tidak tinggal di pulau jawa & sumatra, silahkan cari alternatif disini.

Juga, dikonfigurasi diatas kita hanya menggunakan upstream DNS server, takni mengarah ke cloudflared kita.

Bagian ServerIP hanya sebagai pemanis untuk melihat "stats" terkait mesin kita (docker container) di dashboard nya Pi-hole.

Sekarang mari kita jalankan semua service nya:

$ docker-compose up -d

Kita jalankan via mode detached because why not.

Tunggu beberapa saat (bisa di log via docker-compose logs -f pihole) jika sudah, arahkan jaringanmu untuk menggunakan 127.0.0.1 sebagai DNS server nya dan here we go!

Silahkan arahkan pi.hole ke 127.0.0.1 via /etc/hosts agar hidupmu menjadi lebih mudah juga!

Untuk login (pertama kali), kamu akan disuruh set password (yang mana akan dikasih tau caranya oleh Pi-hole). Yang kamu lakukan adalah menjalankan docker-compose exec pihole -a -p dan silahkan isi dengan password yang kamu inginkan!

Blocking the blockers

Mari kita berikan karma!

Kita bisa mem-blacklist beberapa domain bisa di cek di bagian Blacklist. Sekarang mari kita coba blacklist uzone.id dengan regex wildcard.

Oh iya, dan si aduankonten juga :)

Mari kita test! via HTTP, buat konten aja

Biasanya kalau lo akses domain yang di block (ehm internetposesif thing), maka lo akan diarahkan ke domain tersebut, jadi, yaa mari kita block karena internet kita menjadi posesif!

Silahkan kamu bisa block lain domain-domain yang tidak ingin kamu akses seperti s3w0rd.com misalnya.

Kekurangan

Pertama, ini hanya berjalan di komputer kamu, bukan di semua jaringan di rumahmu misalnya. Untuk di handphone, gue pakai 1.1.1.1 nya klodpeler.

Kedua, karena Pi-hole dan cloudflared hanya bertugas untuk hal-hal terkait DNS, alias, tidak bisa melakukan bypass sistem DPI. Jika kamu tetap kekeuh ingin menonton Netflix misalnya (yang sampai 11 May 2020 masih di block!)  kamu bisa baca tulisan ini.

Mungkin nanti kalau ada waktu kita akan buat Pi-hole dan cloudflared ini berjalan oke bareng green-tunnel juga misalnya.

Ketiga, kita tetap membutuhkan Adblock. Ada beberapa layanan yang menampilkan iklan di client-side, dan juga adblock berguna untuk "menghilangkan" element yang berkaitan dengan iklan.

Keempat, belum ada masalah lain. Kasih tau gue kalau ada!

Penutup

Enjoy the power of Pi-hole & DoH!

Silahkan gunakan solusi DoH lain selain Cloudflare, jika ingin.

Dengan menggunakan Pi-hole gue bisa melakukan ads & tracker blocker di level DNS. Dan juga, gue bisa melihat statistik untuk melihat komputer gue ini melakukan dns query kemana aja (ada request apa aja).

Juga bisa melakukan blacklist berdasarkan kebijakan sendiri, bukan dipaksa oleh kebijakan orang lain.

Dan, dengan menggunakan Docker, gue bisa lebih mudah untuk mengatur proses-proses yang ada, selain hanya agar membuat proses tersebut ter-isolasi.

Terakhir, pastikan Pi-hole mu menggunakan custom upstream DNS yang mengarah ke cloudflared (10.0.0.2:5053), agar proses dns query dilakukan via DoH.

/admin/settings.php?tab=dns

Nantinya, biar di level cloudflared kamu tentukan ingin menggunakan 1.1.1.1, quad9, google dns, atau apapun itu.

Sudah ~3 jam gue menjalankan Pi-hole, dan (sampai gue menulis di bagian ini) sudah melakukan 3,822 query dan mem-block 103 domain.

Pi-hole bagaikan kondom dalam menggunakan internet. Setiap orang bisa bebas ingin menggunakan kondom atau tidak ketika having sex, dan agar sedikit aman, kamu bisa menggunakannya beserta dengan beberapa "drawbacks" yang didapat bila menggunakan kondom wqwqwq.

Terima kasih!