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: dipakai berjamaah).
Akhirnya gw kasih tahu solusi lain yang mudah dan murah, yaitu mengaktifkan fitur DNS over HTTPS (DoH) pada browsernya. Beberapa saat kemudian lalu salah satunya memberi respon berikut.
Saat ini sebagian besar browser-browser populer sudah memiliki fitur DoH. Meskipun begitu, ternyata masih banyak orang yang belum tahu tentang adanya fitur ini.
Dengan mengaktifkan fitur DoH, hampir semua situs yang diblokir oleh ISP* bisa dibuka kembali loh.
* DNS-based block
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 VPN) dan mencari tahu apakah cara" tersebut sudah cukup untuk menyembunyikan kita dari 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 ke sebuah DNS server untuk menanyakan alamat IP dari domain www.reddit.com
agar halaman situs tersebut bisa dimuat kemudian. DNS server ini simplenya berisi informasi/mapping dari nama domain ke alamat IP.
Kueri DNS ini pada umumnya dikirim ke DNS server milik ISP/operator seluler yang kamu pakai.
Ketika kita mengakses situs yang ternyata nama domain-nya tercatat di “daftar hitam”-nya DNS server, maka DNS server tersebut akan otomatis meng-overwrite alamat IP dari domain tersebut dengan alamat IP dari 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
.
Berdasarkan hasil tracert
dibawah ini, situs www.reddit.com
diterjemahkan ke blockpage.sensor.id
yang alamat IPnya 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, atahu memang pure timeout.
Kita bisa validasi hal diatas apakah situs reddit benar menggunakan alamat IP ***.215.248.131
menggunakan Google Toolbox: dig yang hasilnya adalah berikut.
Oke ternyata alamat IP dari www.reddit.com
adalah 151.101.X.140
, bukan ***.215.197.131
! Yah komputernya kena penipuan :/
Alur kueri DNS simplenya bisa diilustrasikan seperti berikut.
Nah pemblokiran sebuah situs disini dilakukan setelah melewati router ISP dimana kueri DNS diteruskan ke DNS server. Jika pada kueri tersebut terdapat situs yang terdapat pada daftar hitam DNS, maka kita akan dialihkan ke halaman blokir.
Darimana gw tau 10.***.44.1 itu router ISP?
Nope, gw gak tau itu router atau bukan, tapi perangkat ini punya port SSH, 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
Tapi kan HTTPS, kok bisa ISP tau?
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 tanpa enkripsi (plain-text).
Jadi saat kita mengunjungi sebuah situs, ISP hanya dapat melihat domain dan alamat IP dari situs tersebut. Hal seperti username, password, bahkan URL endpointnya pun, misal website.com/api/v1/login?username=admin&passwd=admin
, tidak akan bisa diketahui oleh ISP.
Dengan DoH, kueri DNS ikut “dibungkus” HTTPS sebagai bagian konten aplikasi ke endpoint DoH seperti Cloudflare https://cloudflare-dns.com/dns-query.
Sebenarnya dengan atau tanpa DoH, ISP tetap tahu tujuan kita mau kemana, namun dengan DoH ini, ISP tidak bisa lagi mencegat dan membongkar kueri DNS yang kita kirimkan dan akhirnya komputer kita terhindar dari “penipuan” alamat yang dilakukan DNS server ISP tadi.
Terus cloudflare-dns.com di-resolve siapa?
DNSnya ISP sih wkwkw..
Yah ketahuan kan 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 IPnya cloudflare wkwkw
Terus kalau IP DoH resolvernya diblokir ISP/Kom*nfo?
Kembali ke VPN deh hahah..
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 di gak perlu khawatir deh!
Thou Shalt (By)Pass
Hosts file: The Primivite DNS
Tanpa DoH, sebenarnya kita bisa menghindari “penipuan” alamat IP tersebut di level cache alias melakukan bypass DNS.
Kita tahu bahwa alasan komputer kita membuat DNS kueri terlebih dahulu ke DNS server saat akan mengakses sebuah situs web adalah karena si komputer belum tahu alamat IP dari domain situs web yang kita maksud. Setelah si komputer tahu, alamat IP dan domain situs web ini akan di simpan pada DNS 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 pada dasarnya hanyalah sekumpulan entry IP yang me-mapping alamat IP dengan nama domain yang terupdate secara periodik sehingga bersifat dinamis. Di level OS sendiri terdapat sebuah file yang merupakan bentukan primitif dari DNS server dan 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 gw pengguna Windows, yang akan dibahas disini adalah hosts
file Windows saja tetapi secara fungsi keduanya sama (dan pengguna Linux rata-rata suhu soalnya).
Karena file hosts
ini akan selalu di-load ke dalam DNS cache, kita bisa memanfaatkan ini untuk memberi tahu komputer secara langsung (bypass) bahwa alamat IP, misalnya www.reddit.com
adalah 151.101.129.140
dengan menambahkan sebuah entry 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
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 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?
Pakai Google Toolbox!
Jadi kamu bisa resolve dulu IPnya menggunakan Google Toolbox: dig.
Lalu tambahkan record tersebut ke hosts
file:
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 berdasarkan IP.
Untuk menghindari itu, salah satu cara ‘murah’ dan mudah yang gw gunakan selain VPN adalah menggunakan private server lalu memanfaatkan fitur builtin SOCKS proxy dari SSH. Private server yang gw pakai itu gw 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:
Mudah kan?
Untuk memudahkan proses switching proxy-unproxy, gw pakai ekstensi browser bernama FoxyProxy. Jadi gak harus buka-buka settingan browser lagi. Berikut tampilannya.
Konfigurasinya? sama dengan settingan browser!
Dengan mengirimkan request ke ifconfig.co/json
, saat ini IP gw adalah IP dari si private server.
Lalu ditambah dengan DoH dan di test lewat https://dnsleaktest.com/ hasilnya adalah:
Sampai sini seharusnya ISP kurang lebih hanya melihat komputer gw yang mengakses si private server dengan trafik seperti berikut.
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 tapi kesimpulannya bisa di-“tabel”-kan 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 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.