Saat ini sebagian besar browser-browser populer sudah memiliki fitur DNS over HTTPS (DoH). Tapi meskipun begitu, ternyata masih banyak yang belum tahu tentang adanya fitur ini.

Settingan DoH pada Chrome dan Firefox

Settingan DoH pada Chrome dan Firefox

Loh tahu dari mana?

Flashback sedikit, jadi ada beberapa teman yang setiap kali mau mengakses reddit atahu web streaming anime ilegal, mereka harus pakai VPN untuk bypass blokirannya ISP. Karena VPN-nya ini gratisan (baca: dipakai berjamaah dan di-limit), sudah pasti jatuhnya lemot.

Dan setelah mereka tahu soal fitur DoH, salah satunya memberi respon berikut:

Sebuah testimoni

Sebuah testimoni

Agak risih juga sih ISP di negara ini sukanya main bloc-bloc-an.

Nah di postingan ini saya akan coba bahas kenapa DoH bisa dipakai untuk mem-bypass website yang diblokir. Selanjutnya saya juga akan menggunakan dua cara alternatif untuk melakukan bypass (tanpa VPN) dan mencari tahu apakah cara" tersebut sudah cukup untuk menyembunyikan kita dari ISP.

How do ISPs block websites?

Normalnya ketika kita mengakses sebuah situs, misal www.reddit.com, komputer kita akan mengirimkan sebuah kueri DNS ke sebuah DNS server untuk menanyakan alamat IP dari domain www.reddit.com agar halaman situs tersebut bisa dimuat kemudian. Kueri DNS ini biasanya diarahkan ke DNS server milik ISP/operator seluler yang kamu pakai.

Nah ketika kita mengakses situs yang kebetulan terdaftar di blacklist DNS server ISP, maka DNS server tersebut akan memberikan alamat IP palsu yang merupakan halaman blokir milik si ISP seperti merconsuar, ipo, dll.

Kita bisa liat alur-nya secara detail dengan WireShark, tetapi agar lebih simple, kita juga bisa menggunakan tracert.

$ tracert -4 -d -h 5 www.reddit.com

Tracing route to blockpage.****.id [***.215.197.131] 
over a maximum of 5 hops:

  1     2 ms     2 ms     2 ms  192.168.1.1 
  2     *        *        *     Request timed out.
  3    38 ms    32 ms    24 ms  10.***.44.1 
  4    26 ms    31 ms    22 ms  ***.215.248.78 
  5    33 ms    25 ms    27 ms  ***.215.248.82 

Trace complete.

Di hop kedua saya kurang yakin apakah modem ADSL tidak punya/punya hop count seperti router yang akhirnya tracert menampilkan timeout, atahu memang pure timeout.

Berdasarkan hasil tracert diatas, www.reddit.com di resolve ke blockpage.sensor.id yang alamat IPnya ***.215.248.131 dan kita bisa validasi ini menggunakan Google Toolbox Dig yang hasilnya:

Hasil dig www.reddit.com

Hasil dig www.reddit.com

Ternyata alamat dari www.reddit.com adalah 151.101.X.140, bukan ***.215.197.131!

Yah komputernya kena penipuan :/

Anyway, alur request-nya bisa diilustrasikan seperti berikut.

Ilustrasi(nya)

Ilustrasi(nya)

Darimana saya tahu 10.***.44.1 itu router ISP?

Nope, saya gak tahu itu router atahu bukan, tapi perangkat ini punya port SSH dan SNMP, jadi kemungkinan perangkat ini di monitor.

$ nc -vn 10.***.44.1 22
Ncat: Version 5.59BETA1 ( http://nmap.org/ncat )
Ncat: Connected to 10.***.44.1:22.
SSH-2.0-OpenSSH_7.5
$ nc -u -vn 10.***.44.1 161
Ncat: Version 5.59BETA1 ( http://nmap.org/ncat )
Ncat: Connected to 10.***.44.1:161

Tapi kan HTTPS?

Enkripsi HTTPS/TLS itu ada di bagian kontennya1, sedangkan paket-paket DNS kueri yang dikirimkan untuk me-resolve nama domain ke sebuah alamat IP tidak masuk ke dalam enkripsi tersebut.

Kueri DNS itu mendahului trafik HTTP/S

Jadi misalnya ketika kita melakukan login di suatu HTTPS website, ISP gak akan tahu username dan password yang kita masukkan, bentukan login page tersebut, dan bahkan sampai ke endpoint URLnya (website.com/api/v1/login/?username=admin&password=admin123).

Contoh konten yang dienkripsi

Contoh konten yang dienkripsi

Dengan kata lain, ISP hanya tahu tujuan kita mau kemana, tapi dia (seharusnya) gak bisa lihat apa yang kita lakukan di tempat tujuan itu.

Sampai disini, tentunya kita bisa menyimpulkan sendiri kenapa DoH bisa membuat komputer kita menghindari “penipuan” yang dilakukan DNS server ISP tersebut.

Yap, karena kueri DNSnya dibungkus HTTPS.

Awalnya DNS kueri dikirimkan tanpa enkripsi ke DNS server ISP melalui port 53, tapi dengan DoH, DNS kueri ini sekarang di deliver melalui HTTPS ke endpoint DoH yang juga HTTPS, misalnya Cloudflare: https://cloudflare-dns.com/dns-query.

Terus cloudflare-dns.com di resolve siapa?

DNSnya ISP wkwkw. Yah ketahuan kan pakai DoH.

Tenang, kita bisa pakai versi IP 1^4-nya.

$ curl -H 'accept: application/dns-json' "https://1.1.1.1/dns-query?name=www.reddit.com"
{"Status":0,"TC":false,"RD":true,"RA":true,"AD":false,"CD":false,"Question":[{"name":"www.reddit.com","type":1}],"Answer":[{"name":"www.reddit.com","type":5,"TTL":288,"data":"reddit.map.fastly.net."},{"name":"reddit.map.fastly.net","type":1,"TTL":18,"data":"151.101.65.140"},{"name":"reddit.map.fastly.net","type":1,"TTL":18,"data":"151.101.129.140"},{"name":"reddit.map.fastly.net","type":1,"TTL":18,"data":"151.101.193.140"},{"name":"reddit.map.fastly.net","type":1,"TTL":18,"data":"151.101.1.140"}]}

Thou Shalt (By)Pass

Hosts file: The Primivite DNS

Tanpa DoH, sebenarnya kita bisa menghindari “penipuan” alamat IP tersebut di level cache.

Kita tahu bahwa alasan komputer kita membuat DNS kueri terlebih dahulu ke DNS server saat akan mengakses sebuah website adalah karena si komputer belum tahu alamat IP dari website/domain yang kita maksud. Setelah si komputer tahu, alamat IP dan domain web ini akan di simpan pada DNS Resolver cache. Di request selanjutnya, si komputer akan mengandalkan daftar cache yang ada (selama belum expired).

Pada Windows, kita bisa melihat daftar IP dan nama domain yang sudah di cache dengan menjalankan perintah berikut.

C:\>ifconfig /displaydns

DNS server sendiri pada dasarnya hanyalah sekumpulan entry yang me-mapping alamat IP dengan nama domain secara dinamik. Pada level OS, terdapat sebuah file yang merupakan bentukan primivite dari DNS bersifat statik, yaitu file hosts.

File hosts Windows bisa ditemukan di C:\Windows\System32\drivers\etc\hosts sedangkan untuk Unix-like, file hosts terdapat di /etc/hosts. Karena saya pengguna Windows, yang akan di bahas disini adalah hosts file Windows saja (pengguna Linux rata-rata sudah suhu soalnya).

Windows hosts file

Windows hosts file

Pada Windows, file hosts ini akan selalu di-load ke dalam DNS Resolve cache, dan kita bisa memanfaatkan ini untuk memberi tahu komputer secara langsung bahwa alamat IP, misalnya www.reddit.com, adalah 151.101.129.140. Caranya memberi tahunya adalah dengan menambahkan sebuah entry ke dalam file hosts dengan format berikut.

# [Alamat IP] [domain name 1] [domain name 2] [domain name N]
151.101.129.140 reddit.com www.reddit.com

image-20211104131236469

Sekarang kita bisa jalankan kembali perintah yang sama untuk menampilkan DNS cache, tapi sebelum itu ada baiknya DNS cache ini di-flush terlebih dulu.

C:\>ipconfig /flushdns # clear cache dulu untuk menghilangkan brainwash dari DNS server ISP
C:\>ipconfig /displaydns

Seharusnya saat ini www.reddit.com dan reddit.com berada di entry paling atas.

Karena si komputer sudah tahu alamat IP dari www.reddit.com, maka dia tidak perlu lagi “bertanya” ke DNS server ISP.

$ tracert -d www.reddit.com

Tracing route to reddit.com [151.101.129.140]
over a maximum of 30 hops:

  1   120 ms     2 ms     3 ms  192.168.43.1
  2     *        *        *     Request timed out.
  3   162 ms    26 ms    26 ms  10.***.44.2
  4   160 ms    25 ms    30 ms  ***.215.36.238 
  5   187 ms    46 ms    46 ms  180.87.12.233
  6   186 ms    57 ms    50 ms  180.87.12.232
  7   191 ms    49 ms    47 ms  180.87.12.250
  8    49 ms    49 ms    48 ms  210.57.30.38
  9   188 ms    53 ms    52 ms  202.84.219.174
 10    70 ms    49 ms    52 ms  202.84.219.174
 11    60 ms    54 ms    49 ms  202.84.224.197
 12    83 ms    80 ms    85 ms  210.57.38.171
 13   205 ms   200 ms   203 ms  151.101.129.140 

Trace complete.

Kalau untuk website lain gimana?

Google Toolbox!

Jadi kamu resolve dulu IPnya lewat Google Toolbox Dig.

image-20211104142819468

Maka di hosts filenya:

image-20211104142858365

SSH SOCKS Proxy + DoH

Penggunaan host file dan DoH memang bisa mem-bypass Website, tapi pihak ISP tetap bisa mengetahui kita mengakses situs dan domain apa.

Untuk menghindari itu, salah satu cara ‘murah’ dan mudah yang saya gunakan selain VPN adalah menggunakan private server lalu memanfaatkan fitur builtin SOCKS proxy dari SSH (jatuhnya transparan). Private server ini saya deploy sendiri di Microsoft Azure.

Jika dari pembaca ada yang masih berstatus ‘student’, silahkan cek link berikut:

Untuk memanfaatkan SSH tunnel sebagai SOCKS proxy, perintahnya cukup simple:

$ ssh -i az_vm.key fproxy-user@20.109.***.213 -D 1080 -N
  • -D 1080: Buka SOCKS proxy di port 1080 (listen)
  • -N: Tanpa interactive shell.

Saat ini SOCKS Proxy via SSH sudah tersedia di 127.0.0.1 port 1080, dan kita tinggal mengkonfigurasikan setting-an proxy pada browser seperti berikut:

Firefox proxy settings

Firefox proxy settings

Mudah kan?

Btw, saya pakai ekstensi browser FoxyProxy, supaya saat switch on/off-nya mudah dan gak harus buka-buka settingan browser, berikut tampilannya.

FoxyProxy Toogle

FoxyProxy Toogle

Konfigurasinya? sama dengan settingan browser!

Konfigurasi SOCKS Proxy di Foxy Proxy

Konfigurasi SOCKS Proxy di Foxy Proxy

Dengan mengirimkan request ke ifconfig.co/json, saat ini IP saya adalah IP dari si private server.

Akses ifconfig.co dengan proxy

Akses ifconfig.co dengan proxy

Lalu ditambah dengan DoH dan di test lewat https://dnsleaktest.com/.

Test DNS leak dengan DoH aktif

Test DNS leak dengan DoH aktif

Sampai sini seharusnya ISP kurang lebih hanya melihat komputer saya yang mengakses si private server dengan trafik seperti berikut.

Web trafic yang terenkripsi melalui SSH tunnel

Web trafic yang terenkripsi melalui SSH tunnel

Conclusion

Selain menggunakan VPN, setidaknya ada 3 solusi di postingan ini yang bisa kamu coba untuk mem-bypass DNS filter yang diterapkan oleh ISP langganan kamu:

  • Hosts file,
  • DoH,
  • SSH SOCKS Proxy + DoH.

Menggunakan hosts file dan DoH hanya sebatas menghindari komputer kita dari “penipuan” alamat palsu oleh DNS server ISP. Sedangkan untuk “SSH SOCKS Proxy + Doh”, selain menghindari “penipuan”, tunnel yang dibuat juga mengenkripsi keseluruhan trafik web kita.

Hasil testing ketiganya, bukan testing sih, bisa ditabelkan(?) seperti berikut.

Bypass DNS filters Hide the domain we visit ?
Hosts file Probably yes No
DoH Yes, mostly No
DoH + SSH SOCKS Proxy Yes, mostly, but it depends. Yes

Apakah dengan ini saya sudah bisa menjadi anggota anonymous?

Nope, karena private server yang saya pakai pun milik sesuatu yang lebih besar dari ISP dan dua-duanya mengumpulkan data juga.

Baiklah, sekian untuk postingan ini~


  1. https://https.cio.gov/faq/#what-does-https-do ↩︎

Reference