Jalankan DNS Anda Sendiri melalui HTTPS (DoH) Resolver di Ubuntu dengan DNSdist

Jalankan DNS Anda Sendiri melalui HTTPS (DoH) Resolver di Ubuntu dengan DNSdist

Tutorial ini akan menunjukkan kepada Anda bagaimana mengatur DNS Anda sendiri melalui HTTPS (DoH) resolver di Ubuntu dengan DNSdist, sehingga permintaan DNS Anda dapat dienkripsi dan dilindungi dari pengintaian.

Apa itu DNS over HTTPS dan Mengapa Itu 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 di kawat dan dapat dieksploitasi oleh entitas tengah. Misalnya, Great Firewall of China ( GFW ) menggunakan teknik yang disebut racun cache DNS untuk menyensor Internet China. (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 tanggapan DNS. Misalnya, jika pengguna Internet China ingin mengunjungi google.com, GFW mengembalikan alamat IP yang berlokasi di China, bukan alamat IP asli Google, ke pemecah DNS pengguna. Kemudian DNS resolver mengembalikan alamat IP palsu ke komputer pengguna, sehingga pengguna tidak dapat mengunjungi google.com.

HTTPS adalah cara standar untuk mengenkripsi halaman web HTTP teks biasa. Dengan DNS over HTTPS (DoH), kueri DNS Anda akan dienkripsi, jadi tidak ada pihak ketiga yang dapat melihat kueri DNS Anda.

Mengapa Menjalankan Pemecah DoH Anda Sendiri?

Sudah ada beberapa DNS resolver publik seperti 1.1.1.1 dan 9.9.9.9 yang mendukung DNS melalui HTTPS, jadi Anda dapat menggunakannya jika Anda tidak memiliki keahlian atau waktu untuk menjalankannya sendiri. Dimulai dengan Firefox versi 61, Anda dapat mengaktifkan DNS melalui HTTPS di pengaturan browser, yang merupakan kemajuan besar untuk keamanan dan privasi Internet. Firefox menggunakan resolver Cloudflare (1.1.1.1) secara default. Namun, beberapa orang berpendapat bahwa ini memungkinkan Cloudflare mengumpulkan informasi tentang pengguna Firefox. Mereka tampaknya lebih percaya pada ISP mereka daripada Cloudflare. Tetapi saya pikir jika Anda paranoid tentang privasi, Anda harus menjalankan resolver DoH Anda sendiri, jadi baik Cloudflare maupun ISP Anda tidak dapat memata-matai Anda.

DoH vs DoT

Selain DNS melalui HTTPS, ada protokol lain yang juga bertujuan untuk mengenkripsi permintaan DNS. Ini disebut DNS over TLS (DoT). Sebelumnya saya menulis panduan untuk menggunakan DNS melalui TLS di desktop Ubuntu , tetapi sekarang saya beralih ke DNS melalui HTTPS.

Bagi orang-orang di negara-negara yang menindas dengan sensor internet yang parah seperti China, lebih menguntungkan menggunakan DoH daripada DoT. Ini karena DoT beroperasi pada port TCP 853 , yang dapat dengan mudah diblokir oleh firewall nasional. DoH beroperasi pada TCP port 443 , yang merupakan port standar untuk situs web HTTPS, yang membuat DoH sangat sulit diblokir, karena jika TCP port 443 diblokir, maka hampir semua situs web HTTPS juga akan diblokir. Penyelesai DoH saya berjalan di VPS (server pribadi virtual) yang terletak di luar China dan Great Firewall of China tidak dapat mencegat kueri DNS saya. Saya bahkan dapat menyembunyikan alamat IP resolver DoH saya di belakang Cloudflare CDN (Jaringan Pengiriman Konten).

Keuntungan lain dari DoH adalah memungkinkan aplikasi web mengakses informasi DNS melalui API browser yang ada, jadi tidak diperlukan pemecah rintisan.

Dukungan DoH di Penyelesai DNS Utama

  • BIND akan mendukung DoH di versi 9.17 , yang masih dalam pengembangan. Repositori Ubuntu 20.04 dan 20.10 dikirimkan dengan BIND 9.16.
  • Knot penyelesai mendukung DOH sejak versi 4.0.0. Versi terbaru saat ini adalah 5.11. Ini memiliki repositori resmi untuk Debian, Ubuntu, CentOS, Fedora.
  • Tidak terikat mendukung DoH sejak versi 1.12.0.
  • PowerDNS recursor tidak mendukung DoH sekarang.

Sebenarnya, saya lebih suka menjalankan resolver DoH dengan DNSdist , yang menambahkan dukungan DoH di versi 1.4.0. Versi terbaru saat ini adalah 1.5. Ini memiliki repositori resmi untuk Debian, Raspbian, Ubuntu, dan CentOS. DNSdist adalah penyeimbang beban DNS yang dapat meneruskan kueri DNS ke resolver DNS backend, jadi apa pun resolver DNS yang Anda gunakan, Anda dapat menggunakan DNSdist untuk menjalankan server DoH Anda sendiri. DNSdist dikembangkan oleh tim PowerDNS.

Prasyarat

Diasumsikan bahwa Anda memiliki resolver DNS yang berjalan di server Ubuntu Anda. Anda dapat menggunakan resolver DNS (BIND, Knot resolver, Unbound…) Saya pribadi menggunakan BIND.

  • Siapkan Pemecah DNS BIND9 Anda Sendiri di Ubuntu 16.04 / 18.04
  • Siapkan Pemecah DNS BIND9 Anda Sendiri di Ubuntu 20.04

Setelah pemecah DNS Anda aktif dan berjalan, ikuti petunjuk di bawah ini.

Langkah 1: Instal DNSdist di Server Ubuntu

Direkomendasikan untuk menginstal DNSdist di Ubuntu dari repositori upstream, sehingga Anda akan memiliki versi stabil terbaru. Pertama, Anda perlu membuat file daftar sumber untuk DNSdist.

Ubuntu 20.04

echo "deb [arch = amd64] http://repo.powerdns.com/ubuntu focal-dnsdist-15 utama" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 18.04

echo "deb [arch = amd64] http://repo.powerdns.com/ubuntu bionic-dnsdist-15 utama" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 16.04

echo "deb [arch = amd64] http://repo.powerdns.com/ubuntu xenial-dnsdist-15 utama" | sudo tee /etc/apt/sources.list.d/pdns.list

Selanjutnya, kami membuat file preferensi untuk DNSdist untuk menyematkan paket, jadi kami tidak akan menginstal DNSdist dari repositori lain secara tidak sengaja.

sudo nano /etc/apt/preferences.d/dnsdist

Tambahkan baris berikut ke dalam file.

Paket: dnsdist *
Pin: repo.powerdns.com asal
Pin-Prioritas: 600

Simpan dan tutup file. Kemudian jalankan perintah berikut untuk mengimpor kunci publik PowerDNS, sehingga manajer paket APT dapat memverifikasi interitas paket perangkat lunak yang diunduh dari repositori ini.

curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -

Selanjutnya, perbarui daftar repositori dan instal DNSdist.

pembaruan sudo apt

sudo apt menginstal dnsdist

Secara default, DNSdist mencoba untuk mengikat ke port 53. Karena Anda memiliki resolver DNS yang ada seperti BIND mendengarkan pada port 53, itu dnsdist.serviceakan gagal untuk memulai.

Karena kami hanya menerapkan resolver DoH dan tidak peduli dengan penyeimbangan beban DNS, kami dapat mengonfigurasi DNSdist untuk mendengarkan di port lain. Edit file konfigurasi DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Tidak ada konten dalam file ini. Untuk saat ini, cukup tambahkan baris berikut di file ini, sehingga DNSdist akan mendengarkan TCP dan UDP port 5353, bukan port 53.

setLocal ("127.0.0.1:5353")

Simpan dan tutup file. Kemudian restart DNSdist.

sudo systemctl restart dnsdist

Periksa statusnya.

status systemctl dnsdist

Ini harus aktif (berjalan) .

Langkah 2: Instal Let's Encrypt Client (Certbot) di Server Ubuntu

DNS melalui HTTPS memerlukan penginstalan sertifikat TLS di sisi server. Kami akan mendapatkan dan menginstal sertifikat Let's Encrypt. Keuntungan menggunakan sertifikat Let's Encrypt adalah gratis, lebih mudah diatur, dan dipercaya oleh perangkat lunak klien.

Jalankan perintah berikut untuk menginstal Let's Encrypt client (certbot) dari repositori default Ubuntu.

sudo apt menginstal certbot

Untuk memeriksa nomor versi, jalankan

certbot --version

Output sampel:

certbot 0.40.0

Langkah 3: Dapatkan Sertifikat TLS Tepercaya dari Let's Encrypt

Saya merekomendasikan menggunakan plugin standaloneor webrootuntuk mendapatkan sertifikat TLS untuk dnsdist.

Plugin Mandiri

Jika tidak ada server web yang berjalan di server Ubuntu Anda, Anda dapat menggunakan plugin mandiri untuk mendapatkan sertifikat TLS dari Let's Encrypt. Buat rekam A DNS untuk subdomain (doh.example.com), lalu jalankan perintah berikut.

sudo certbot certonly --standalone --preferred-challenge http --agree-tos --email you@example.com -d doh.example.com

Dimana:

  • certonly: Dapatkan sertifikat tetapi jangan instal.
  • --standalone: Gunakan plugin mandiri untuk mendapatkan sertifikat
  • --preferred-challenges http: Lakukan tantangan http-01 untuk memvalidasi domain kami, yang akan menggunakan port 80.
  • --agree-tos: Setuju dengan Let's Encrypt persyaratan layanan.
  • --email: Alamat email digunakan untuk pendaftaran dan pemulihan akun.
  • -d: Tentukan nama domain Anda.

Seperti yang Anda lihat dari tangkapan layar berikut, saya berhasil memperoleh sertifikat.

Menggunakan Plugin webroot

Jika server Ubuntu Anda memiliki server web yang mendengarkan pada port 80 dan 443, maka sebaiknya gunakan plugin webroot untuk mendapatkan sertifikat karena plugin webroot berfungsi dengan hampir semua server web dan kami tidak perlu menginstal sertifikat di server web.

Pertama, Anda perlu membuat host virtual untuk doh.example.com .

Apache

Jika Anda menggunakan Apache, maka

sudo nano / etc / apache2 / sites-available / doh.example.com .conf

Dan tempel baris berikut ke dalam file.

        
        ServerName doh.example.com

        DocumentRoot / var / www / dnsdist

Simpan dan tutup file. Kemudian buat direktori root web.

sudo mkdir / var / www / dnsdist

Tetapkan www-data (pengguna Apache) sebagai pemilik root web.

sudo chown www-data: www-data / var / www / dnsdist -R

Aktifkan host virtual ini.

sudo a2ensite doh.example.com

Muat ulang Apache agar perubahan diterapkan.

sudo systemctl memuat ulang apache2

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 you@exmaple.com -d doh.example.com -w / var / www / dnsdist

Nginx

Jika Anda menggunakan Nginx, maka

sudo nano /etc/nginx/conf.d/ doh.example.com .conf

Tempel baris berikut ke dalam file.

server {
      dengarkan 80;
      SERVER_NAME doh.example.com ;

      root / var / www / dnsdist /;

      location ~ /.well-known/acme-challenge {
         perbolehkan semua;
      }
}

Simpan dan tutup file. Kemudian buat direktori root web.

sudo mkdir -p / var / www / dnsdist

Tetapkan www-data (pengguna Nginx) sebagai pemilik root web.

sudo chown www-data: www-data / var / www / dnsdist -R

Muat ulang Nginx agar perubahan diterapkan.

sudo systemctl memuat ulang 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 you@exmaple.com -d doh.example.com -w / var / www / dnsdist

Langkah 4: Aktifkan DoH di DNSdist

Edit file konfigurasi DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Tambahkan baris berikut ke dalam file.

- izinkan kueri dari semua alamat IP
addACL ('0.0.0.0/0')

- tambahkan resolver DoH yang mendengarkan pada port 443 dari semua antarmuka
addDOHLocal ("0.0.0.0:443", "/ etc / letsencrypt / live / doh.example.com /fullchain.pem", "/ etc / letsencrypt / live / doh.example.com /privkey.pem", {" / "}, {doTCP = true, reusePort = true, tcpFastOpenSize = 0})

- resolver hilir
newServer ({address = "127.0.0.1:53", qps = 5, name = "resolver1"})

Simpan dan tutup file. DNSdist berjalan sebagai _dnsdistpengguna, jadi kita perlu memberikan _dnsdistizin kepada pengguna untuk membaca sertifikat TLS dengan perintah berikut.

sudo apt menginstal acl

sudo setfacl -R -mu: _dnsdist: rx / etc / letsencrypt /

Kemudian periksa sintaks file konfigurasi.

sudo dnsdist --check-config

Jika sintaksnya ok, mulai ulang DNSdist.

sudo systemctl restart dnsdist

Perhatikan bahwa jika ada server web yang mendengarkan pada port TCP 443, DNSdist akan gagal memulai ulang. Anda dapat menghentikan sementara server web. Saya akan menjelaskan cara membuat web server dan DNSdist menggunakan TCP port 443 secara bersamaan di akhir artikel ini.

Langkah 5: Konfigurasikan DoH di Browser Web Firefox

Buka Preferensi -> Umum dan gulir ke bawah ke bawah untuk mengonfigurasi Pengaturan Jaringan . Aktifkan DNS melalui HTTPS, dan atur resolver DoH Anda sendiri.

Kami kemudian dapat menyempurnakan konfigurasi DoH dengan membuka about:configtab di Firefox.

network.trr.mode

Secara default, Parameter di Firefox disetel ke , yang berarti jika kueri DoH gagal, Firefox akan meneruskan kueri DNS ke sistem host. Saya ingin selalu menggunakan resolver DoH, jadi ubah ke sehingga resolver host tidak akan digunakan. Ini memungkinkan kami memiliki cara mudah untuk menguji apakah resolver DoH Anda berfungsi.network.trr.mode2network.trr.mode3

network.trr.allow-rfc1918

Ini disetel ke falsedefault, yang berarti jika respons DNS menyertakan alamat IP pribadi, maka itu akan dianggap sebagai respons salah yang tidak akan digunakan. Jika Anda menggunakan zona kebijakan respons di BIND , Anda mungkin memiliki beberapa nama host yang mengarah ke alamat IP pribadi, lalu setel nilai ini ke true.

jaringan. trr. bootstrapAddress

Firefox perlu mencari alamat IP penyelesai DoH untuk mengirim kueri DNS. Anda dapat meletakkan alamat IP di bidang ini untuk menghilangkan kueri awal ini.

Menguji

Sekarang masukkan nama domain seperti linuxbabe.comdi bilah alamat Firefox. Jika halaman web dimuat secara normal, itu pertanda baik resolver DoH Anda berfungsi. Lalu pergi ke konsol terminal server DNS Anda dan periksa log kueri DNS. Saya menggunakan BIND, jadi saya memasukkan perintah berikut untuk memeriksa log kueri DNS.

Ubuntu 20.04

sudo journalctl -eu bernama

Ubuntu 18.04

sudo journalctl -eu bind9

Seperti yang Anda lihat dari log BIND di bawah ini, Firefox menanyakan domain berikut.

  • www.linuxbabe.com : situs web saya
  • fonts.gstatic.com : Ini menyajikan font Google di situs web saya
  • cdn.shareaholic.net : widget berbagi di situs saya
  • newsletter.linuxbabe.com : platform pemasaran email yang dihosting sendiri .
  • translate.google.com : widget terjemahan Google di situs web saya

Log kueri di atas memberi tahu saya bahwa DNS saya melalui resolver HTTPS berfungsi. Jika saya menghentikan resolver BIND (sudo systemctl stop bernama), Firefox memberi tahu saya bahwa situs itu tidak dapat ditemukan. Dan saat saya memulai BIND, halaman web dimuat lagi.

Buat DNSdist dan server web menggunakan port 443 secara bersamaan

Sebuah DNS over HTTPS resolver perlu mengikat ke port 443. Jika Anda sudah memiliki Apache / Nginx yang mendengarkan pada port 443, maka DNSdist tidak dapat mengikat ke port 443. Biasanya port hanya dapat digunakan oleh satu proses. Namun kita bisa menggunakan HAproxy (High Availability Proxy) dan SNI (Server Name Indication) untuk membuat DNSdist dan Apache / Nginx menggunakan port 443 secara bersamaan.

Konfigurasi DNSdist

Edit file konfigurasi DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Ubah alamat mendengarkan DoH menjadi 127.0.0.1.

addDOHLocal (" 127.0.0.1 : 443", "/ etc / letsencrypt / live / doh.example.com /fullchain.pem", "/ etc / letsencrypt / live / doh.example.com /privkey.pem", {" / "}, {doTCP = true, reusePort = true, tcpFastOpenSize = 0})

Simpan dan tutup file. Kemudian restart DNSdist.

sudo systemctl restart dnsdist

Konfigurasi Nginx

Jika Anda menggunakan Nginx, edit file blok server.

sudo nano /etc/nginx/conf.d/ example.com .conf

Di blok server SSL, temukan petunjuk berikut.

dengarkan 443 ssl;

Ubah ke

dengarkan 127.0.0.2:443 ssl;

Kali ini kita bikin listening 127.0.0.2:443karena 127.0.0.1:443sudah diambil DNSdist. Simpan dan tutup file. File konfigurasi utama Nginx /etc/nginx/nginx.confdan blok server default /etc/nginx/sites-enabled/defaultmungkin menyertakan host virtual default yang mendengarkan pada 443, jadi Anda mungkin perlu mengedit file ini juga.

Kemudian restart Nginx.

sudo systemctl restart nginx

Konfigurasi Apache

Jika Anda menggunakan server web Apache, edit file host virtual Anda.

sudo nano / etc / apache2 / sites-enabled / example.com .conf

Di host virtual SSL, ubah

Untuk

Kali ini kita bikin listening 127.0.0.2:443karena 127.0.0.1:443sudah diambil DNSdist. Simpan dan tutup file. Kemudian edit /etc/apache2/ports.conffile tersebut.

sudo nano /etc/apache2/ports.conf

Perubahan

Dengarkan 443

Untuk

Dengarkan 127.0.0.2:443

Simpan dan tutup file. Mulai ulang Apache.

sudo systemctl restart apache2

Konfigurasi HAProxy

Sekarang instal HAproxy.

sudo apt menginstal haproxy

Mulai HAProxy

sudo systemctl mulai haproxy

Edit file konfigurasi.

sudo nano /etc/haproxy/haproxy.cfg

Jika Anda menggunakan Nginx, salin dan tempel baris berikut ke akhir file. Ganti 12.34.56.78dengan alamat IP publik server Anda. Ganti doh.example.comdengan nama domain yang digunakan oleh DNSdist dan www.example.comdengan nama domain yang digunakan oleh server web Anda.

https frontend
   mengikat 12.34.56.78 : 443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content terima jika {req_ssl_hello_type 1}

   use_backend dnsdist jika {req_ssl_sni -i doh.example.com }
   use_backend nginx if {req_ssl_sni -i www.example.com }
   use_backend nginx if {req_ssl_sni -i example.com }

   default_backend dnsdist

backend dnsdist
   mode tcp
   opsi ssl-hello-chk
   server dnsdist 127.0.0.1:443

backend nginx
   mode tcp
   opsi ssl-hello-chk
   server nginx 127.0.0.2:443 periksa

Jika Anda menggunakan Apache, salin dan tempel baris berikut ke akhir file. Ganti 12.34.56.78dengan alamat IP publik server Anda. Ganti doh.example.comdengan nama domain yang digunakan oleh DNSdist dan www.example.comdengan nama domain yang digunakan oleh server web Anda.

https frontend
   mengikat 12.34.56.78 : 443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content terima jika {req_ssl_hello_type 1}

   use_backend dnsdist jika {req_ssl_sni -i doh.example.com }
   use_backend apache jika {req_ssl_sni -i www.example.com }
   use_backend apache jika {req_ssl_sni -i example.com }

   default_backend dnsdist

backend dnsdist
   mode tcp
   opsi ssl-hello-chk
   server dnsdist 127.0.0.1:443

apache backend
    mode tcp
    opsi ssl-hello-chk
    apache server 127.0.0.2:443 periksa

Simpan dan tutup file. Kemudian restart HAproxy.

sudo systemctl restart haproxy

Pada konfigurasi di atas, kami memanfaatkan fitur SNI (Server Name Indication) di TLS untuk membedakan lalu lintas VPN dan lalu lintas HTTPS normal.

  • Ketika doh.example.comberada di TLS Client Halo, HAProxy mengarahkan lalu lintas ke backend DNSdist.
  • Ketika www.example.comberada di TLS Client Halo, HAProxy mengarahkan lalu lintas ke backend apache / nginx.
  • Jika klien tidak menentukan nama server di TLS Client Halo, maka HAproxy akan menggunakan backend default (DNSdist).

Anda dapat menguji penyiapan ini dengan opensslalat tersebut. Pertama, jalankan perintah berikut beberapa kali.

echo | openssl s_client -hubungkan server-Anda-IP : 443 | subjek grep

Kami tidak menentukan nama server pada perintah di atas, jadi HAproxy akan selalu meneruskan permintaan ke backend default (DNSdist), dan sertifikatnya akan dikirim ke klien. Selanjutnya, jalankan dua perintah berikut.

echo | openssl s_client -servername www.example.com -connect Anda-server-IP : 443 | subjek grep

echo | openssl s_client -servername doh.example.com -connect Anda-server-IP : 443 | subjek grep

Sekarang kami menentukan nama server dalam perintah, jadi HAproxy akan meneruskan permintaan sesuai dengan aturan SNI yang kami tentukan.

Saat memperbarui sertifikat Let's Encrypt untuk situs web Anda, disarankan agar Anda menggunakan http-01tantangan daripada tls-alpn-01tantangan, karena HAproxy mendengarkan pada port 443 dari alamat IP publik, sehingga dapat mengganggu proses pembaruan.

sudo certbot memperbaharui --preferred-challenge http-01

Membungkus

Sekian tutorial kali ini, jika kamu menemui masalah, silahkan tinggalkan komentar