Memakai DNSCrypt Untuk Menghindari DNS Injection


Selama ini saya tidak pernah memakai DNS server dari ISP, melainkan selalu memakai DNS server dari pihak ketiga. Alasannya adalah DNS server dari ISP sangat lambat dan tidak aman. Semua berjalan dengan lancar sampai ketika beberapa hari yang lalu, saya menemukan banyak masalah pada jaringan saya. Kode program yang menulis log kesalahan ke server chat Slack tiba-tiba mengeluh server tidak ditemukan. Saya juga mulai kesulitan mengakses server GitHub (terkadang sukses tapi terkadang gagal). Seperti masalah jaringan lain pada umumnya, saya mulai melakukan troubleshooting dengan memantau packet melalui Wireshark. Hasilnya, saya menemukan respon dari server milik ISP padahal saya tidak mengaksesnya.

Mengapa demikian? Banyak kemungkinan yang bisa saja terjadi di infrastruktur ISP (atau rahasia lainnya yang tidak saya ketahui karena saya bukan pegawai disitu). ISP bisa saja memakai transparant proxy yang melakukan filtering pada seluruh data yang keluar masuk. Tapi, saya akan mulai dengan memeriksa sesuatu yang lebih masuk akal, misalnya memeriksa DNS aktual yang saya pakai melalui situs https://www.dnsleaktest.com. Saya cukup terkejut ketika mendapati laporan bahwa DNS server yang dipakai adalah DNS server milik ISP. Loh, bukankah saya sudah memakai DNS server milik pihak ketiga? Mungkin sekali ISP telah mengubah setiap request DNS pada port UDP 53 menjadi merujuk ke server DNS milik mereka. Jadi, tidak peduli apapun DNS server yang saya tentukan di router, ISP secara diam-diam akan ‘menggantinya’ ke server DNS yang berbeda. Teknik ini sering kali disebut DNS Injection yang diimplementasikan dengan memakai Transparant DNS Proxy.

Salah satu cara untuk menghindari DNS Injection adalah dengan memakai DNSCrypt yang dikembangkan oleh OpenDNS. DNSCrypt memakai protokol DNSCurve yang ditujukan untuk menggantikan protokol DNS (yang sampai sekarang masih dipakai dimana-mana). Protokol ini lebih aman karena request DNS di-enkripsi sehingga upaya untuk memodifikasi respon dari server akan lebih sulit. Saat ini OpenDNS adalah penyedia terbesar untuk layanan DNS yang mendukung DNSCurve.

Saya segera membuka halaman http://dnscrypt.org/dnscrypt-proxy/download untuk men-download source DNSCrypt. Karena memakai sistem operasi Linux UBuntu, saya men-download file dnscrypt-proxy-1.4.0.tar.gz dan men-extract-nya.

DNSCrypt bergantung pada libsodium. Oleh sebab itu, saya perlu men-download source terbaru library tersebut di https://github.com/jedisct1/libsodium/releases. Setelah men-extract-nya, saya akan men-install library tersebut dengan memberikan perintah berikut ini:

# sudo ./configure
# sudo make
# sudo make install
# sudo ldconfig

Untuk memastikan libsodium telah ter-install, saya dapat memeriksanya dengan perintah berikut ini:

# sudo ldconfig -p | grep libsodium

Berikutnya, saya akan berpindah ke lokasi source code DNSCrypt dan men-install-nya dengan memberikan perintah berikut ini:

# sudo ./configure
# sudo make
# sudo make install

Binary DNSCrypt secara otomatis akan ter-install pada lokasi /usr/local/sbin. Untuk menguji apakah DNSCrypt dapat bekerja dengan baik, saya memberikan perintah berikut ini:

# dnscrypt-proxy --resolver-name=opendns --test=0

Agar lebih aman, saya dapat memakai parameter --user sehingga dnscrypt-proxy melakukan chroot() ke user dengan hak akses yang lebih terbatas. Untuk membuat user baru, saya dapat menggunakan perintah berikut ini:

# sudo adduser --disabled-login --no-create-home --system dnscrypt

Untuk menjalankan DNSCrypt sebagai user baru tersebut, saya dapat menggunakan perintah:

# sudo dnscrypt-proxy --resolver-name=opendns --user=dnscrypt --test=0

Berikutnya, saya ingin DNSCrypt dijalankan secara otomatis. Pada Linux UBuntu yang memakai Upstart, saya bisa menambah file baru di /etc/init dengan nama seperti dnscrypt-proxy.conf yang isinya adalah:

# DNSCrypt Proxy

description "DNSCrypt proxy using OpenDNS resolver"

start on net-device-up

exec /usr/local/sbin/dnscrypt-proxy --resolver-name=opendns --user=dnscrypt

respawn

Penggunaan respawn pada script Upstart di atas menyebabkan DNSCrypt proxy akan dijalankan ulang secara otomatis bila terjadi service tersebut mengalami kegagalan.

Sekarang, bila saya me-restart komputer, DNSCrypt akan tetap dijalankan secara otomatis. Saya bisa memeriksanya dengan menggunakan perintah:

# sudo status dnscrypt-proxy
dnscrypt-proxy start/running, process 199

Setelah DNSCrypt dijalankan, ia akan menyediakan layanan DNS biasa pada port 53. Saya perlu men-konfigurasi jaringan agar tidak lagi mengakses server DNS milik siapapun lagi karena pada akhirnya akan dialihkan ke server milik ISP. Saya perlu men-konfigurasi jaringan agar mengakses DNS di 127.0.0.l (localhost) pada port 53. Setelah menerima request di port ini, DNSCrypt akan melakukan koneksi ter-enkripsi ke port 443 milik server OpenDNS dan mengembalikan hasilnya ke pengguna.

Tapi ada satu masalah yang perlu saya selesaikan terlebih dahulu.

Pada versi Ubuntu baru, saya menemukan bahwa Dnsmasq akan dijalankan secara otomatis. Dnsmasq juga akan memakai port 53 pada 127.0.0.1 sebagai layanan DNS. Untuk itu, saya perlu mematikan layanan Dnsmasq karena tidak dibutuhkan lagi. Caranya adalah dengan mengubah isi file /etc/NetworkManager/NetworkManager.conf dan memberikan komentar pada baris berikut ini:

# dns=dnsmasq

Sebagai langkah terakhir, saya perlu mengatur masing-masing jaringan agar memakai DNS server pada lokasi 127.0.0.1, seperti pada gambar berikut ini:

Mengatur DNS untuk jaringan di Linux Ubuntu

Mengatur DNS untuk jaringan di Linux Ubuntu

Setelah me-restart jaringan, DNS injection dari ISP tidak lagi bekerja. Saya bisa memastikan diri memakai DNS resolver dari OpenDNS dan bukan milik ISP dengan membuka halaman http://www.opendns.com/welcome. Bila memakai DNS server dari OpenDNS, akan terlihat tanda centang besar.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: