Di waktu yang lalu, beberapa teman gw mengalami kesulitan saat akan mengakses situs seperti reddit atau situs streaming anime ilegal legal yang tidak lain dan tidak bukan ini karena situs-situs tersebut diblokir oleh ISP. Solusi mereka saat itu tentu saja pakai VPN, tapi sayangnya muncul problem lain, yaitu speed internet yang turun drastis. Yap! Karena VPN yang digunakan ini gratisan (baca: berjamaah).

Akhirnya, gw kasih tahu solusi lain yang mudah dan murah, yaitu mengaktifkan fitur DNS over HTTPS (DoH) pada browsernya. Beberapa saat kemudian, salah satunya memberi respon berikut.

Sebuah testimoni

Sebuah testimoni

Saat ini sebagian besar browser-browser populer sudah memiliki fitur DoH. Meskipun begitu, ternyata masih banyak orang yang belum tahu tentang adanya fitur ini.

Settingan DoH pada Chrome dan Firefox

Settingan DoH pada Chrome dan Firefox

Dengan mengaktifkan fitur DoH, hampir semua situs yang diblokir oleh ISP bisa dibuka kembali, loh.

Kok bisa?

Nah, dipostingan ini gw akan coba bahas kenapa DoH bisa dipakai untuk mem-bypass website yang diblokir*. Selanjutnya gw juga akan menggunakan dua cara alternatif untuk melakukan bypass tanpa DoH ataupun VPN dan mencari tahu apakah cara-cara tersebut bisa menjadikan kita sebagai anonymous 🎭, setidaknya untuk ISP.

*Aslinya cuma dasar kerja DNS, but let me try to explain it.

How do ISPs block websites?

DNS Request Flow

Normalnya ketika kita mengakses sebuah situs, misal www.reddit.com, komputer kita akan mengirimkan sebuah kueri DNS. Kueri ini pada umumnya dikirim ke server DNS milik ISP/operator seluler yang kita pakai. Tujuannya untuk menanyakan alamat IP dari domain www.reddit.com agar halaman situs tersebut bisa dimuat kemudian. Jadi, server DNS ini simplenya berisi informasi/mapping nama-nama domain dan menerjemahkannya ke alamat IP.

Ketika kita mengakses situs yang ternyata nama domain-nya tercatat di “daftar hitam” server DNS ISP, maka server DNS tersebut akan otomatis menghijack tujuan paket tersebut dengan mengganti alamat IP dari domain yang dituju dengan alamat IP dari domain halaman blokir milik si ISP, seperti merconsuar, IPO chan, dll.

DNS Hijack

Dengan Wireshark, kita bisa lihat hasil hijack atau poisoning alamat IP yang diberikan oleh server DNS ISP untuk www.reddit.com. Dari inspeksi dari kueri DNS untuk www.reddit.com, hasilnya adalah kita diarahkan ke internetpositif.id yang beralamat di 36.86.63.185.

image-20241226140545496

Atau dengan melakukan tracing (pelacakan) paket data yang ditujukan ke www.reddit.com dengan tool bawaan Windows, yaitu: tracert. Kali ini, koneksi saya menggunakan tethering dari operator seluler HP. Dari hasil tracing di bawah, muara akhir dari situs www.reddit.com adalah ***.215.248.131.

$ 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 gw kurang yakin apakah modem ADSL tidak punya/punya hop count seperti router yang akhirnya tracert menampilkan timeout, atau memang pure timeout.

Jadi, manakah alamat IP dari www.reddit.com? Kita bisa validasi hal ini menggunakan tool seperti Dig Google atau Dig Web Interface. Ibaratnya, kita membuat kueri DNS langsung di komputer dan ISP pihak penyedia tool tersebut. Hasilnya adalah berikut.

Hasil dig www.reddit.com

Hasil dig www.reddit.com

Yap, ternyata alamat IP dari www.reddit.com menurut Google dan Dig Web adalah 151.101.X.140, bukan 36.86.63.185 ataupun ***.215.197.131. Yah, komputernya kena penipuan :/

Alur kueri DNS diatas bisa diilustrasikan sebagai berikut.

Ilustrasi(nya)

Ilustrasi(nya)

Darimana gw tau 10.***.44.1 itu router ISP?

Setiap alamat IP yang dijajaki atau menjadi hop ini tentunya sebuah perangkat router/modem. Perangkat ini juga punya port SSH yang terbuka, jadi kemungkinan memang milik ISP.

$ 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

Tapi kan HTTPS, S-nya secure, kok bisa ISP tahu dan di-hijack?

Perlu diingat, kueri DNS itu mendahului trafik HTTP dan proses enkripsi itu ada dibagian kontennya1.

Tanpa DoH, paket-paket dan kueri DNS untuk me-resolve nama domain ke sebuah alamat IP dikirimkan secara plain-text (tanpa enkripsi).

Saat kita mengunjungi sebuah situs, ISP hanya dapat melihat nama domain dan alamat IP dari situs tersebut. Informasi seperti username, password, dan bahkan URL endpoint/path beserta kuerynya tidak dapat diketahui oleh ISP. Misalnya, jika URL-nya adalah:

https://website.com/api/v1/login?username=admin&password=admin

Maka, yang terlihat oleh ISP saat paket data kita transit di router mereka hanya nama domain, yaitu: website.com. Sedangkan sisanya, akan terenkripsi seperti berikut.

Contoh konten yang dienkripsi

Contoh konten yang dienkripsi

Dengan DoH, kueri DNS ikut “dibungkus” HTTPS sebagai bagian dari konten aplikasi yang dikirim ke endpoint DoH seperti Cloudflare di https://cloudflare-dns.com/dns-query.

Sebenarnya, baik dengan atau tanpa DoH, ISP tetap tahu tujuan kita mau kemana. Namun, dengan DoH ini, ISP tidak dapat lagi mencegat dan membongkar kueri DNS yang kita kirimkan, sehingga komputer kita terhindar dari “penipuan” alamat yang dilakukan server DNS ISP pada kasus reddit.com diatas.

Lalu, endpoint cloudflare-dns.com di-resolve siapa?

Ya, itu DNSnya ISP, sih. Wkwkw.

Yah, ISP tahu nih kita pakai DoH. But 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"}]}

*Tetap ketahuan sih, karena dari alamat IPnya ya punya cloudflare :))

Gimana kalau IP DoH resolvernya diblokir ISP/Kom*nfo?

Kembali ke VPN deh. Hahaha.

Tapi sejauh ini sepertinya teknik blokir situs yang dipakai Kom*nfo dan ISP hanya sebatas di DNS hijack/redirection. Mungkin alasannya, jika yang diblokir sudah sampai IP, kemungkinan service-service internal mereka juga akan bermasalah, entah down atau semacamnya.

Ya, jadi gak perlu khawatir deh!

Karena sudah kejadian di 2024. Lol.

Thou Shalt (By)Pass

Hosts file: The Primivite DNS

Sebenarnya, tanpa DoH, kita bisa menghindari “penipuan” alamat IP tadi di level cache, alias melakukan bypass dengan cara yang mirip dengan tekniknya ISP untuk memblokir situs web.

Kita tahu bahwa alasan komputer kita mengirimkan kueri DNS terlebih dahulu ke server DNS saat akan mengakses sebuah situs web adalah karena komputer belum tahu alamat IP dari domain situs web yang dimaksud. Setelah si komputer tahu, alamat IP dan domain situs web ini akan di simpan pada cache. Di request selanjutnya, komputer akan mengandalkan entri alamat yang ada pada cache, selama entri tersebut belum kadaluarsa, umumnya dalam jangka waktu 24 jam.

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

C:\>ifconfig /displaydns

Informasi nama-nama domain pada server DNS milik ISP memiliki sifat dinamis. Informasi tersebut akan selalu up to date secara periodik alias bersifat dinamis. Nah, di sistem operasi sendiri, terdapat sebuah file yang merupakan bagian dari sistem DNS, namun bersifat statis, yaitu file hosts.

File hosts Windows bisa ditemukan di C:\Windows\System32\drivers\etc\hosts, sedangkan untuk Linux/Unix, file ini terdapat berlokasi di /etc/hosts. Karena gw pengguna Windows, yang akan dibahas disini adalah hosts file Windows saja, tetapi secara fungsi, keduanya sama (pengguna Linux rata-rata udah suhu soalnya).

Windows hosts file

Windows hosts file

File hosts ini akan selalu masuk ke dalam entri cache DNS. Kita bisa memanfaatkan hal ini untuk memberi tahu komputer secara langsung (bypass) bahwa alamat IP, misalnya www.reddit.com adalah 151.101.129.140 dengan menambahkan sebuah entri ke dalam file tersebut 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 Server DNS 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 server DNS milik 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 situs lain gimana?

Caranya, kamu bisa resolve dulu IPnya menggunakan tool dig DNS, misalnya dengan dig milik Google.

image-20211104142819468

Lalu tambahkan hasil record yang di dapat ke dalam hosts file:

image-20211104142858365

SSH SOCKS Proxy

Penggunaan host file dan DoH memang bisa mem-bypass Website, tapi pihak ISP masih bisa mengetahui situs apa yang kita akses berdasarkan kepemilikan IP dan nama domain. Untuk menghindari ini, salah satu cara ‘murah’ dan mudah yang gw gunakan selain VPN adalah menggunakan virtual private server dan memanfaatkan fitur SOCKS proxy bawaan OpenSSH. VPS bisa kalian beli atau deploy sendiri di platform cloud seperti Microsoft Azure.

Jika dari pembaca ada yang masih berstatus pelajar, silahkan cek tautan ini.

Untuk memanfaatkan proxy SOCKS dari SSH, perintahnya cukup simple:

$ ssh user@vps-ip -D 1080 -N
  • -D 1080: Buka SOCKS proxy di port 1080
  • -N: Tanpa interactive shell.

Saat ini proxy SOCKS sudah tersedia pada local interface, 127.0.0.1:1080. Kita tinggal mengkonfigurasikan browser untuk menggunakan proxy tersebut.

Firefox proxy settings

Firefox proxy settings

Mudah kan?

Untuk memudahkan proses switching proxy-unproxy, gw pakai ekstensi browser bernama FoxyProxy. Jadi, gw gak perlu buka-buka settingan browser lagi. Berikut tampilannya.

FoxyProxy Toogle

FoxyProxy Toogle

Konfigurasinya? sama dengan settingan browser tadi!

Konfigurasi SOCKS Proxy di Foxy Proxy

Konfigurasi SOCKS Proxy di Foxy Proxy

Untuk mengecek apakah proxy tersebut berjalan, cukup kunjungi situs: ifconfig.co/json. Sebagai contoh, hasil berikut menunjukkan IP publik gw sekarang adalah IP publik si VPS dan terdeteksi berada di US.

Akses ifconfig.co dengan proxy

Akses ifconfig.co dengan proxy

Sampai sini seharusnya ISP hanya lihat komputer gw yang mengakses VPS 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 metode yang bisa kamu coba untuk melakukan bypass web filter yang diterapkan oleh ISP langganan kamu,:

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

Menggunakan hosts file dan DoH hanya sebatas menghindari komputer kita dari “penipuan” alamat palsu oleh server DNS 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 tapi kesimpulannya bisa di-“tabel”-kan seperti berikut.

Bypass Web filtersHide the domain we visit from ISP?
Hosts fileProbably yesNo
DoHYes, mostlyNo
SSH SOCKS ProxyYes, mostly, but it depends.Yes

Apakah dengan ini gw sudah bisa menjadi seperti bjoorka anonymous user?

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

Baiklah, sekian untuk postingan ini semoga bermanfaat. See you in the next post.

Reference