Tutorial ini akan menunjukkan cara menyiapkan DNS Anda sendiri melalui HTTPS (DoH) penyelesai di Ubuntu dengan DNSdist, sehingga kueri DNS Anda dapat dienkripsi dan dilindungi dari pengintaian.
Apa itu DNS over HTTPS 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.
HTTPS adalah cara standar untuk mengenkripsi halaman web HTTP teks biasa. Dengan DNS over HTTPS (DoH), kueri DNS Anda akan dienkripsi, sehingga tidak ada pihak ketiga yang dapat melihat kueri DNS Anda.
Mengapa Menjalankan Resolver DoH Anda Sendiri?
Sudah ada beberapa resolver DNS publik seperti 1.1.1.1
dan 9.9.9.9
yang mendukung DNS melalui HTTPS, sehingga Anda dapat menggunakannya jika Anda tidak memiliki keterampilan 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 untuk mengumpulkan informasi tentang pengguna Firefox. Mereka tampaknya lebih percaya pada ISP mereka daripada Cloudflare. Tapi saya pikir jika Anda paranoid tentang privasi, Anda harus menjalankan resolver DoH Anda sendiri, sehingga Cloudflare maupun ISP Anda tidak dapat memata-matai Anda.
DoH vs DoT
Selain DNS over HTTPS, ada protokol lain yang juga bertujuan untuk mengenkripsi permintaan DNS. Ini disebut DNS melalui TLS (Dot). Sebelumnya saya menulis panduan untuk menggunakan DNS melalui TLS di desktop Ubuntu, tetapi sekarang saya beralih ke DNS melalui HTTPS.
Untuk orang-orang yang tinggal di negara dengan sensor internet yang ketat seperti China, lebih menguntungkan menggunakan DoH.
- DoT beroperasi pada port TCP 853 , yang dapat dengan mudah diblokir oleh firewall nasional.
- DoH beroperasi pada port TCP 443 , yang merupakan port standar untuk situs web HTTPS, yang membuat DoH sangat sulit untuk diblokir, karena jika port TCP 443 diblokir, maka hampir semua situs web HTTPS juga akan diblokir.
Resolver DoH saya berjalan di VPS (virtual private server) yang terletak di luar China dan Great Firewall of China tidak dapat mencegat permintaan DNS saya. Saya bahkan dapat menyembunyikan alamat IP resolver DoH saya di balik Cloudflare CDN (Content Delivery Network).
Keuntungan lain dari DoH adalah memungkinkan aplikasi web mengakses informasi DNS melalui API browser yang ada, jadi tidak diperlukan stub resolver.
Dukungan DoH di Resolver DNS Utama
- BIND akan mendukung DoH di versi 9.17, yang masih dalam pengembangan. Repositori Ubuntu 20.04 dan 21.04 dikirimkan dengan BIND 9.16.
- Simpul 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.
- Rekursor PowerDNS tidak mendukung DoH saat ini.
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 penyelesai DNS yang berjalan di server Ubuntu Anda. Anda dapat menggunakan resolver DNS (BIND, Knot resolver, Unbound…) 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
Setelah DNS resolver Anda aktif dan berjalan, ikuti petunjuk di bawah ini.
Langkah 1:Instal DNSdist di Server Ubuntu
Jika Anda menggunakan Ubuntu non-LTS , Anda harus menginstal dnsdist dari repositori default (sudo apt install dnsdist
). Jika Anda menggunakan Ubuntu LTS , disarankan untuk menginstal DNSdist 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 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Ubuntu 18.04
echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Ubuntu 16.04
echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu xenial-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Selanjutnya, kami membuat file preferensi untuk DNSdist untuk menyematkan paket, sehingga kami tidak akan secara tidak sengaja menginstal DNSdist dari repositori lain.
sudo nano /etc/apt/preferences.d/dnsdist
Tambahkan baris berikut ke dalam file.
Package: dnsdist* Pin: origin repo.powerdns.com Pin-Priority: 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.
sudo apt update sudo apt install dnsdist
Secara default, DNSdist mencoba mengikat ke port 53. Karena Anda memiliki resolver DNS yang sudah ada seperti BIND yang mendengarkan pada port 53, dnsdist.service
akan gagal untuk memulai.
Karena kami hanya menggunakan 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 dalam file ini, sehingga DNSdist akan mendengarkan pada port TCP dan UDP 5353, bukan port 53.
setLocal("127.0.0.1:5353")
Simpan dan tutup file. Kemudian restart DNSdist.
sudo systemctl restart dnsdist
Periksa statusnya.
systemctl status dnsdist
Seharusnya aktif (berjalan) .
Langkah 2:Instal Let's Encrypt Client (Certbot) di Server Ubuntu
DNS melalui HTTPS 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 memeriksa nomor versi, jalankan
certbot --version
Contoh keluaran:
certbot 0.40.0
Langkah 3:Dapatkan Sertifikat TLS Tepercaya dari Let's Encrypt
Saya sarankan menggunakan standalone
atau webroot
plugin untuk 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 DNS A record untuk subdomain (doh.example.com), lalu jalankan perintah berikut.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d doh.example.com
Dimana:
certonly
:Dapatkan sertifikat tetapi jangan menginstalnya.--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 persyaratan layanan Let's Encrypt.--email
:Alamat email digunakan untuk pendaftaran dan pemulihan akun.-d
:Tentukan nama domain Anda.
Seperti yang Anda lihat dari tangkapan layar berikut, saya berhasil mendapatkan 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 rekatkan baris berikut ke dalam file.
<VirtualHost *:80> ServerName doh.example.com DocumentRoot /var/www/dnsdist </VirtualHost>
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 reload 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 [email protected] -d doh.example.com -w /var/www/dnsdist
Nginx
Jika Anda menggunakan Nginx, maka
sudo nano /etc/nginx/conf.d/doh.example.com.conf
Rekatkan baris berikut ke dalam file.
server { listen 80; server_name doh.example.com; root /var/www/dnsdist/; location ~ /.well-known/acme-challenge { allow all; } }
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 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 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.
-- allow query from all IP addresses addACL('0.0.0.0/0') -- add a DoH resolver listening on port 443 of all interfaces 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 }) -- downstream resolver newServer({address="127.0.0.1:53",qps=5, name="resolver1"})
Simpan dan tutup file. DNSdist berjalan sebagai _dnsdist
pengguna, jadi kita perlu memberikan _dnsdist
izin pengguna untuk membaca sertifikat TLS dengan perintah berikut.
sudo apt install acl sudo setfacl -R -m u:_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 untuk memulai ulang. Anda dapat menghentikan sementara server web. Cara membuat web server dan DNSdist menggunakan TCP port 443 secara bersamaan akan saya jelaskan di akhir artikel ini.
Saat Certbot memperbarui sertifikat TLS, Anda perlu memberikan izin lagi, tetapi Anda dapat menambahkan perintah di file crontab.
sudo crontab -e
Seperti ini:
@daily certbot renew --quiet && setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/
Langkah 5:Konfigurasi DoH di Browser Web Firefox
Buka Preferensi -> Umum dan gulir ke bawah ke bawah untuk mengonfigurasi Setelan Jaringan . Aktifkan DNS melalui HTTPS, dan atur resolver DoH Anda sendiri.
Kami kemudian dapat menyempurnakan konfigurasi DoH dengan masuk ke about:config
tab di Firefox.
jaringan.trr.mode
Secara default, network.
parameter di Firefox disetel ke 2
, yang berarti jika kueri DoH gagal, Firefox akan meneruskan kueri DNS ke sistem host. Saya ingin selalu menggunakan resolver DoH, jadi ubah network.trr.mode
ke 3
jadi resolver host tidak akan digunakan. Ini memungkinkan kami memiliki cara mudah untuk menguji apakah resolver DoH Anda berfungsi.
network.trr.allow-rfc1918
Ini disetel ke false
secara default, 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 menunjuk ke alamat IP pribadi, lalu setel nilai ini ke true
.
jaringan. trr. bootstrapAddress
Firefox perlu mencari alamat IP dari resolver DoH untuk mengirim kueri DNS. Anda dapat memasukkan alamat IP di bidang ini untuk menghilangkan kueri awal ini.
Pengujian
Sekarang masukkan nama domain seperti linuxbabe.com
di bilah alamat Firefox. Jika halaman web dimuat secara normal, itu pertanda baik bahwa resolver DoH Anda berfungsi. Kemudian pergi ke konsol terminal server DNS Anda dan periksa log permintaan DNS. Saya menggunakan BIND, jadi saya memasukkan perintah berikut untuk memeriksa log permintaan DNS.
Ubuntu 20.04
sudo journalctl -eu named
Ubuntu 18.04
sudo journalctl -eu bind9
Seperti yang Anda lihat dari log BIND di bawah, 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 web saya
- newsletter.linuxbabe.com :platform pemasaran email saya 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 penyelesai BIND (sudo systemctl stop named
), Firefox memberi tahu saya bahwa situs itu tidak dapat ditemukan. Dan ketika saya memulai BIND, halaman web dimuat kembali.
Langkah 6:Konfigurasi Klien DoH di Desktop Ubuntu
Saya tahu ada 3 klien DNS open-source di Linux yang mendukung DNS terenkripsi.
- diselesaikan dengan sistem
- gemuk
- dnscrypt-proxy
Saat ini, dnscrypt-proxy
adalah implementasi klien DoH terbaik di Linux, jadi saya akan menunjukkan cara menggunakannya. Jalankan perintah berikut untuk menginstal dnscrypt-proxy
di desktop Ubuntu Anda.
sudo apt install dnscrypt-proxy
Ini akan dimulai secara otomatis, seperti yang Anda lihat dengan:
sudo systemctl status dnscrypt-proxy
Jika tidak memulai, Anda dapat menjalankan perintah berikut untuk memulainya.
sudo systemctl enable dnscrypt-proxy --now
Periksa alamat mendengarkan.
sudo ss -lnptu | grep dnscrypt-proxy
Di komputer saya, dnscrypt-proxy mendengarkan 127.0.2.1:53
. Ada layanan systemd lain (dnscrypt-proxy-resolvconf.service
) diinstal oleh dnscrypt-proxy,
systemctl status dnscrypt-proxy-resolvconf
Ini adalah layanan yang menyetel 127.0.2.1
sebagai resolver di komputer Anda. Anda dapat memeriksa resolver DNS saat ini untuk komputer Anda dengan:
cat /etc/resolv.conf
Secara default, dnscrypt-proxy menggunakan Clouldflare sebagai resolver DoH upstream. Untuk menggunakan resolver DoH Anda sendiri, edit file konfigurasi.
sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml
Temukan baris berikut
server_names = ['cloudflare']
Ubah ke nama host penyelesai DoH Anda. Perhatikan bahwa lokasi parameter itu penting. Anda tidak boleh memasukkan server_names
parameter di tempat lain dalam file ini.
server_names = ['doh.example.com']
Kemudian beri komentar pada [sources]
bagian.
#[sources] # [sources.'public-resolvers'] # url = 'https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md' # cache_file = '/var/cache/dnscrypt-proxy/public-resolvers.md' # minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3' # refresh_delay = 72 # prefix = ''
Kita perlu menambahkan resolver DoH kita sendiri seperti di bawah ini di bagian bawah file ini.
[static] [static.'doh.example.com'] stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'
Cap berisi nama host penyelesai DoH, alamat IP, dan jalur kueri Anda. Untuk mendapatkan cap Anda sendiri, gunakan kalkulator cap DNS online. Pilih DNS-over-HTTPS sebagai protokol, dan masukkan alamat IP, nama host, dan jalur kueri. Jika Anda mengikuti tutorial ini untuk menyiapkan resolver DoH Anda sendiri, jalurnya harus disetel hanya ke /
. Jika Anda tidak mengaktifkan DNSSEC di resolver, hapus centang pada kotak DNSSEC.
Setelah Anda menambahkan cap DNS Anda, simpan dan tutup file. Kemudian restart dnscrypt-proxy
.
sudo systemctl restart dnscrypt-proxy
Periksa statusnya. Pastikan itu berjalan.
systemctl status dnscrypt-proxy
Sekarang Anda dapat menguji apakah dnscrypt-proxy berfungsi.
Jika Anda tidak ingin memublikasikan DNS Anda melalui resolver HTTPS ke seluruh dunia, Anda dapat menghapus catatan DNS A dari nama host resolver DoH Anda, karena dnscrypt-proxy memiliki alamat IP di cap DNS.
Mengonfigurasi DoH di iOS
iOS mendukung DNS melalui HTTPS sejak iOS 14. Namun, tidak ada opsi konfigurasi sederhana di iOS untuk mengatur resolver DoH. Anda perlu membuat .mobileconfig
file dan instal di iOS. Agak rumit untuk menghasilkan .mobileconfig
iOS yang ditandatangani berkas.
Jika resolver DoH Anda tidak akan digunakan secara publik, Anda dapat membuat file sederhana yang tidak ditandatangani. Gunakan editor teks untuk membuat file dengan .mobileconfig
perpanjangan. Salin dan tempel teks berikut. Ganti alamat IP dan URL server.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PayloadContent</key> <array> <dict> <key>DNSSettings</key> <dict> <key>DNSProtocol</key> <string>HTTPS</string> <key>ServerAddresses</key> <array> <string>12.34.56.78</string> </array> <key>ServerURL</key> <string>https://doh.example.com/</string> </dict> <key>PayloadDescription</key> <string>Configures device to use Encrypted DNS over HTTPS</string> <key>PayloadDisplayName</key> <string>My own DNS over HTTPS Resolver</string> <key>PayloadIdentifier</key> <string>com.apple.dnsSettings.managed.9d6e5fdf-e404-4f34-ae94-27ed2f636ac4</string> <key>PayloadType</key> <string>com.apple.dnsSettings.managed</string> <key>PayloadUUID</key> <string>35d5c8a0-afa6-4b36-a9fe-099a997b44ad</string> <key>PayloadVersion</key> <integer>1</integer> <key>ProhibitDisablement</key> <false/> </dict> </array> <key>PayloadDescription</key> <string>Adds self-hosted DoH resolver to Big Sur and iOS 14 based systems</string> <key>PayloadDisplayName</key> <string>My own DNS over HTTPS</string> <key>PayloadIdentifier</key> <string>com.example.doh</string> <key>PayloadRemovalDisallowed</key> <false/> <key>PayloadType</key> <string>Configuration</string> <key>PayloadUUID</key> <string>A4475135-633A-4F15-A79B-BE15093DC97A</string> <key>PayloadVersion</key> <integer>1</integer> </dict> </plist>
Simpan dan tutup file. Kemudian Anda dapat mengirim file sebagai lampiran email ke iOS Anda. Buka email di iOS dan ketuk lampiran untuk mengunduh file konfigurasi. Setelah itu, buka Settings
iOS -> Profile Downloaded
. Ini akan meminta Anda untuk menginstal profil.
Ketuk tombol Instal dan masukkan kata sandi iOS Anda untuk menginstalnya. Ketuk tombol Instal lagi.
Setelah terinstal, buka Settings
iOS -> VPN & Network
. Gulir ke bawah ke buttom untuk memilih resolver DNS untuk sistem iOS Anda. Perhatikan bahwa resolver DoH ini akan menimpa resolver DNS yang disediakan oleh VPN seperti ProtonVPN. iOS Anda akan selalu menggunakan resolver DoH Anda.
Jika Anda ingin menghapus .mobileconfig
file dari iOS, buka Settings
-> General
-> Profile
.
Buat DNSdist dan server web menggunakan port 443 secara bersamaan
Penyelesai DNS over HTTPS 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 sebuah port hanya dapat digunakan oleh satu proses. Namun, kita dapat 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 arahan berikut.
listen 443 ssl;
Ubah ke
listen 127.0.0.2:443 ssl;
Kali ini kita membuatnya mendengarkan di 127.0.0.2:443
karena 127.0.0.1:443
sudah diambil oleh DNSdist. Simpan dan tutup file. File konfigurasi utama Nginx /etc/nginx/nginx.conf
dan server default memblokir /etc/nginx/sites-enabled/default
mungkin menyertakan host virtual default yang mendengarkan pada 443, jadi Anda mungkin perlu mengedit file ini juga.
Kemudian mulai ulang 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
<VirtualHost *:443>
Untuk
<VirtualHost 127.0.0.2:443>
Kali ini kita membuatnya mendengarkan di 127.0.0.2:443
karena 127.0.0.1:443
sudah diambil oleh DNSdist. Simpan dan tutup file. Kemudian edit /etc/apache2/ports.conf
berkas.
sudo nano /etc/apache2/ports.conf
Ubah
Listen 443
Untuk
Listen 127.0.0.2:443
Simpan dan tutup file. Mulai ulang Apache.
sudo systemctl restart apache2
Konfigurasi HAProxy
Sekarang instal HAproxy.
sudo apt install haproxy
Mulai HAProxy
sudo systemctl start 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.78
dengan alamat IP publik server Anda. Ganti doh.example.com
dengan nama domain yang digunakan oleh DNSdist dan www.example.com
dengan nama domain yang digunakan oleh server web Anda.
frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend dnsdist if { 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 option ssl-hello-chk server dnsdist 127.0.0.1:443 backend nginx mode tcp option ssl-hello-chk server nginx 127.0.0.2:443 check
Jika Anda menggunakan Apache , salin dan tempel baris berikut ke akhir file. Ganti 12.34.56.78
dengan alamat IP publik server Anda. Ganti doh.example.com
dengan nama domain yang digunakan oleh DNSdist dan www.example.com
dengan nama domain yang digunakan oleh server web Anda.
frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend dnsdist if { req_ssl_sni -i doh.example.com } use_backend apache if { req_ssl_sni -i www.example.com } use_backend apache if { req_ssl_sni -i example.com } default_backend dnsdist backend dnsdist mode tcp option ssl-hello-chk server dnsdist 127.0.0.1:443 backend apache mode tcp option ssl-hello-chk server apache 127.0.0.2:443 check
Simpan dan tutup file. Kemudian restart HAproxy.
sudo systemctl restart haproxy
Pada konfigurasi di atas, kami menggunakan fitur SNI (Server Name Indication) di TLS untuk membedakan traffic VPN dan traffic HTTPS normal.
- Saat
doh.example.com
ada di Klien TLS Halo, HAProxy mengalihkan lalu lintas ke backend DNSdist. - Saat
www.example.com
ada di Klien TLS Halo, HAProxy mengalihkan lalu lintas ke backend Apache/nginx. - Jika klien tidak menentukan nama server di TLS Client Hello, maka HAproxy akan menggunakan backend default (DNSdist).
Anda dapat menguji pengaturan ini dengan openssl
alat. Pertama, jalankan perintah berikut beberapa kali.
echo | openssl s_client -connect your-server-IP:443 | grep subject
Kami tidak menentukan nama server dalam 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 your-server-IP:443 | grep subject echo | openssl s_client -servername doh.example.com -connect your-server-IP:443 | grep subject
Sekarang kita tentukan nama server dalam perintah, sehingga HAproxy akan meneruskan permintaan sesuai dengan aturan SNI yang kita tetapkan.
Saat memperbarui sertifikat Let's Encrypt untuk situs web Anda, sebaiknya gunakan http-01
tantangan alih-alih tls-alpn-01
tantangan, karena HAproxy mendengarkan pada port 443 alamat IP publik, sehingga dapat mengganggu proses pembaruan.
sudo certbot renew --preferred-challenges http-01