Tutorial ini akan menunjukkan cara menyiapkan DNS Anda sendiri melalui TLS (DoT) resolver di Ubuntu dengan Nginx, sehingga kueri DNS Anda dapat dienkripsi dan dilindungi dari pengintaian.
Apa itu DNS over TLS dan Mengapa Penting
DNS (Domain Name System) bertanggung jawab untuk menerjemahkan nama domain ke alamat IP. Ini dirancang pada tahun 1987 tanpa memikirkan keamanan atau privasi. Secara default, kueri DNS tidak dienkripsi. Mereka dikirim dalam teks biasa melalui kabel dan dapat dimanfaatkan oleh entitas menengah. Misalnya, Tembok Api Besar China (GFW ) menggunakan teknik yang disebut racun cache DNS untuk menyensor Internet Cina. (Mereka juga menggunakan metode lain, yang berada di luar cakupan artikel ini.)
GFW memeriksa setiap permintaan DNS yang dikirim ke server DNS di luar China. Karena protokol DNS teks biasa didasarkan pada UDP, yang merupakan protokol tanpa koneksi, GFW dapat memalsukan IP klien dan IP server. Ketika GFW menemukan nama domain di daftar blokirnya, itu mengubah respons DNS. Misalnya, jika pengguna Internet China ingin mengunjungi google.com, GFW mengembalikan alamat IP yang terletak di China alih-alih alamat IP asli Google, ke resolver DNS pengguna. Kemudian DNS resolver mengembalikan alamat IP palsu tersebut ke komputer pengguna, sehingga pengguna tidak dapat mengunjungi google.com.
DNS melalui TLS berarti bahwa kueri DNS dikirim melalui koneksi aman yang dienkripsi dengan TLS, teknologi yang sama yang mengenkripsi lalu lintas HTTP.
Mengapa Menjalankan DoT Resolver Anda Sendiri?
Sudah ada beberapa resolver DNS publik seperti 1.1.1.1 dan 9.9.9.9 yang mendukung DNS melalui TLS, jadi Anda dapat menggunakannya jika Anda tidak memiliki keahlian atau waktu untuk menjalankannya sendiri. Namun, beberapa orang berpendapat bahwa ini masih memungkinkan penyedia layanan DNS besar untuk mengumpulkan informasi tentang pengguna. Mereka tampaknya lebih percaya pada ISP mereka. Tapi saya pikir jika Anda paranoid tentang privasi, Anda harus menjalankan resolver DoT Anda sendiri, sehingga baik penyedia layanan DNS besar maupun ISP Anda tidak dapat memata-matai Anda.
Saat ini, tidak semua DNS resolver (BIND, Unbound, Knot resolver, PowerDNS recursor, dll) mendukung DNS melalui TLS. Alih-alih membuat panduan untuk resolver tertentu, saya akan menunjukkan cara menyiapkan proxy Nginx TLS untuk resolver DNS yang ada untuk menyediakan layanan DoT, jadi apa pun DNS resolver yang Anda gunakan, Anda dapat mengikuti tutorial ini.
Prasyarat
Diasumsikan bahwa Anda memiliki penyelesai DNS yang berjalan di server Ubuntu Anda. Anda dapat menggunakan resolver DNS (BIND, Unbound, Knot resolver…) Saya pribadi menggunakan BIND.
- Siapkan Penyelesai DNS BIND9 Anda Sendiri di Ubuntu 16.04/18.04
- Siapkan Penyelesai DNS BIND9 Anda Sendiri di Ubuntu 20.04
Anda juga memerlukan nama domain, karena klien DNS perlu membuat koneksi TLS yang aman dengan resolver DNS kami. Saya mendaftarkan nama domain saya dari NameCheap karena harganya murah dan mereka memberikan perlindungan privasi whois gratis seumur hidup.
Setelah Anda memenuhi persyaratan di atas, ikuti petunjuk di bawah ini.
Langkah 1:Instal Nginx di Server Ubuntu
Ini sangat mudah dilakukan. Cukup jalankan perintah berikut.
sudo apt install nginx
Langkah 2:Dapatkan Sertifikat TLS Tepercaya dari Let's Encrypt
DNS over TLS memerlukan pemasangan sertifikat TLS di sisi server. Kami akan mendapatkan dan menginstal sertifikat Let's Encrypt. Keuntungan menggunakan sertifikat Let's Encrypt adalah gratis, lebih mudah disiapkan, dan dipercaya oleh perangkat lunak klien.
Jalankan perintah berikut untuk menginstal klien Let's Encrypt (certbot) dari repositori default Ubuntu.
sudo apt install certbot
Untuk mendapatkan sertifikat Let's Encrypt TLS, kita bisa membuat virtual host Nginx dengan perintah berikut. Ganti dot.example.com
dengan nama domain Anda sendiri. Jangan lupa untuk membuat catatan DNS A untuk sub-domain ini.
sudo nano /etc/nginx/conf.d/dot.example.com.conf
Salin teks berikut dan tempelkan ke file host virtual.
server { listen 80; server_name dot.example.com; root /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
Simpan dan tutup file. Muat ulang Nginx agar perubahan diterapkan.
sudo systemctl reload nginx
Setelah virtual host dibuat dan diaktifkan, jalankan perintah berikut untuk mendapatkan sertifikat Let's Encrypt menggunakan plugin webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/
Langkah 3:Buat DNS melalui TLS Proxy di Nginx
Edit file konfigurasi utama Nginx.
sudo nano /etc/nginx/nginx.conf
Tambahkan baris berikut di bagian bawah file ini. Perhatikan bahwa mereka harus ditempatkan di luar http
konteks.
stream { # DNS upstream pool upstream dns { zone dns 64k; server 127.0.0.1:53; } # DoT server for decryption server { listen 853 ssl; ssl_certificate /etc/letsencrypt/live/dot.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dot.example.com/privkey.pem; proxy_pass dns; } }
Pada konfigurasi di atas, kita membuat Nginx mengakhiri koneksi TLS pada port 853, kemudian akan mengarahkan permintaan DNS ke resolver DNS lokal yang mendengarkan di 127.0.0.1:53
.
Simpan dan tutup file. Kemudian uji konfigurasi Nginx dan mulai ulang.
sudo nginx -t sudo systemctl restart nginx
Jika ada firewall yang berjalan di server Ubuntu, Anda perlu membuka port TCP 853. Misalnya, jika Anda menggunakan firewall UFW, jalankan perintah berikut.
sudo ufw allow 853/tcp
Karena kami menggunakan DNS melalui TLS, tidak perlu khawatir tentang serangan amplifikasi DNS.
Langkah 5:Konfigurasikan Stubby DoT Client di Desktop Ubuntu
Stubby adalah resolver rintisan DNS open-source yang dikembangkan oleh tim getdns. Penyelesai rintisan adalah klien DNS kecil di komputer pengguna akhir yang menerima permintaan DNS dari aplikasi seperti Firefox dan meneruskan permintaan ke penyelesai rekursif seperti 1.1.1.1 atau 8.8.8.8. Stubby istimewa karena mendukung DNS melalui TLS. Secara default, ini hanya akan mengirim permintaan DNS terenkripsi.
Instal Stubby di desktop Ubuntu dari repositori default.
sudo apt install stubby
Setelah diinstal, stubby berjalan di latar belakang. cek statusnya dengan:
systemctl status stubby
Stubby mendengarkan TCP dan UDP port 53 dari localhost (127.0.0.1). Secara default, Stubby menggunakan DNS pihak ketiga melalui resolver TLS. Kita perlu mengonfigurasinya untuk menggunakan milik kita sendiri.
sudo nano /etc/stubby/stubby.yml
Gulir ke bawah ke upstream_recursive_servers:
bagian dan tambahkan teks berikut di atas server DNS lainnya. Ganti 12.34.56.78 dengan alamat IP dari resolver DoT Anda.
# My Own DNS over TLS resolver - address_data: 12.34.56.78 tls_auth_name: "dot.example.com"
Kemudian cari baris berikut:
round_robin_upstreams: 1
Ubah 1
ke 0
. Ini akan membuat stubby selalu menggunakan DNS Anda sendiri melalui resolver TLS. Jika tidak tersedia, stubby akan menggunakan server DNS lain. Simpan file dan mulai ulang stubby agar perubahan diterapkan.
sudo systemctl restart stubby
Langkah 6:Konfigurasi Desktop Ubuntu untuk Menggunakan Stubby
Meskipun Stubby sedang berjalan, itu tidak digunakan oleh sistem operasi. Klik ikon Network Manager di sudut kanan atas desktop Anda. Kemudian pilih pengaturan kabel. (Jika Anda menggunakan Wi-fi, pilih setelan Wi-fi.)
Klik tombol roda gigi.
Pilih IPv4
tab, lalu di pengaturan DNS, alihkan Automatic
ke OFF, yang akan mencegah sistem Ubuntu Anda mendapatkan alamat server DNS dari router Anda. Masukkan 127.0.0.1
di kolom DNS. Klik Apply
untuk menyimpan perubahan Anda.
Kemudian mulai ulang NetworkManager agar perubahan diterapkan.
sudo systemctl restart NetworkManager
Setelah Anda terhubung kembali, Anda dapat melihat bahwa sistem Ubuntu Anda sekarang menggunakan 127.0.0.1 sebagai server DNS di Details
tab.
Cara Memeriksa Apakah Lalu Lintas DNS Anda Dienkripsi
Kita dapat menggunakan WireShark untuk memantau lalu lintas DNS. Instal WireShark di desktop Ubuntu.
sudo apt install wireshark
Jika Anda ditanya “Haruskah non-pengguna super dapat menangkap paket?”, Jawab Ya. Setelah terinstal, jalankan perintah berikut untuk menambahkan akun pengguna Anda ke grup wireshark sehingga Anda dapat menangkap paket.
sudo adduser your-username wireshark
Keluar dan masuk kembali agar perubahan diterapkan. Kemudian buka WireShark dari menu aplikasi Anda, pilih antarmuka jaringan Anda di WireShark. Misalnya, nama antarmuka Ethernet saya adalah enp5s0. Kemudian masukkan port 853
sebagai filter penangkapan. Ini akan membuat WireShark hanya menangkap lalu lintas pada port 853, yang merupakan port yang digunakan oleh DNS melalui TLS.
Klik tombol di sudut kiri atas untuk mulai menangkap. Setelah itu, di jendela terminal, jalankan perintah berikut untuk menanyakan nama domain dengan menggunakan dig
kegunaan. Misalnya, saya dapat menanyakan catatan A dari nama domain saya.
dig A linuxbabe.com
Sekarang Anda dapat melihat lalu lintas DNS yang ditangkap di WireShark. Koneksi dibuat melalui TCP dan dienkripsi dengan TLS, yang kami inginkan. Anda harus memeriksa apakah kolom Tujuan menyertakan alamat IP dari resolver DoT Anda.
Jika kueri DNS dikirim tanpa enkripsi, maka komputer akan menghubungi server DNS pada port 53. Anda dapat menangkap paket lagi dengan port 53
sebagai filter pengambilan, tetapi Anda tidak akan melihat paket apa pun di WireShark, yang berarti stubby mengenkripsi kueri DNS Anda.