Tento tutoriál vám ukáže, jak nastavit vlastní DNS přes HTTPS (DoH)překladač na Debianu s DNSdist, takže vaše DNS dotazy mohou být zašifrovány a chráněny před zvědavýma očima.
Co je to DNS přes HTTPS a proč je to důležité
DNS (Domain Name System) je zodpovědný za překlad doménových jmen na IP adresy. Byl navržen v roce 1987 bez ohledu na bezpečnost nebo soukromí. Ve výchozím nastavení nejsou dotazy DNS šifrovány. Jsou odesílány v prostém textu na drátě a mohou být využívány středními entitami. Například Great Firewall (GFW ) v Číně používá techniku zvanou Jed mezipaměti DNS cenzurovat čínský internet. (Používají také jiné metody, které jsou nad rámec tohoto článku.)
GFW kontroluje každý DNS dotaz odeslaný na DNS server mimo Čínu. Vzhledem k tomu, že protokol DNS ve formátu prostého textu je založen na UDP, což je protokol bez připojení, GFW může podvrhnout IP klienta i IP server. Když GFW nalezne název domény na svém seznamu blokovaných, změní odpověď DNS. Pokud chce například čínský uživatel internetu navštívit google.com, GFW vrátí IP adresu umístěnou v Číně namísto skutečné IP adresy Google do DNS resolveru uživatele. Potom DNS resolver vrátí falešnou IP adresu do počítače uživatele, takže uživatel nemůže navštívit google.com.
HTTPS je standardní způsob šifrování připojení HTTP ve formátu prostého textu. S DNS over HTTPS (DoH) budou vaše dotazy DNS zašifrovány a žádná třetí strana váš dotaz DNS neuvidí.
Proč spustit svůj vlastní DoH Resolver?
Některé veřejné překladače DNS již existují, například 1.1.1.1
a 9.9.9.9
které podporují DNS přes HTTPS, takže je můžete použít, pokud nemáte dovednosti nebo čas provozovat vlastní. Počínaje Firefoxem verze 61 můžete v nastavení prohlížeče povolit DNS přes HTTPS, což je velký pokrok pro zabezpečení internetu a soukromí. Firefox ve výchozím nastavení používá překladače Cloudflare (1.1.1.1). Někteří lidé však tvrdí, že to umožňuje Cloudflare shromažďovat informace o uživatelích Firefoxu. Zdá se, že mají větší důvěru ve své ISP než Cloudflare. Myslím, že pokud jste paranoidní ohledně soukromí, měli byste spustit svůj vlastní DoH resolver, aby vás Cloudflare ani váš ISP nemohli špehovat.
DoH versus DoT
Existuje další protokol, jehož cílem je také šifrovat dotazy DNS. Říká se tomu DNS přes TLS (Tečka). Jaké jsou výhody používání DNS oproti HTTPS?
Pro lidi žijící v zemích se silnou cenzurou internetu, jako je Čína, je výhodnější používat DoH.
- DoT funguje na portu TCP 853 , kterou lze snadno zablokovat národním firewallem.
- DoH funguje na portu TCP 443 , což je standardní port pro webové stránky HTTPS, což velmi ztěžuje blokování DoH, protože pokud je zablokován port TCP 443, budou zablokovány také téměř všechny webové stránky HTTPS.
Můj resolver DoH běží na VPS (virtuálním soukromém serveru) umístěném mimo Čínu a Great Firewall of China nemůže zachytit mé dotazy DNS. Mohu dokonce skrýt IP adresu svého překladače DoH za Cloudflare CDN (Content Delivery Network).
Další výhodou DoH je, že umožňuje webovým aplikacím přistupovat k informacím DNS prostřednictvím existujících rozhraní API prohlížeče, takže není potřeba žádný stub resolver.
Podpora DoH v hlavních DNS Resolvers
- BIND bude podporovat DoH ve verzi 9.17, která je stále ve vývoji. Debian 10 se dodává s BIND 9.11.
- Uzel řešič podporuje DoH od verze 4.0.0. Aktuální nejnovější verze je 5.3.2. Má oficiální úložiště pro Debian, Debian, CentOS, Fedora.
- Bez závazků podporuje DoH od verze 1.12.0.
- Rekurzor PowerDNS momentálně nepodporuje DoH.
Ve skutečnosti raději spouštím DoH resolver s DNSdist , který přidal podporu DoH ve verzi 1.4. Aktuální nejnovější verze je 1.6. Má oficiální úložiště pro Debian, Raspbian, Debian a CentOS. DNSdist je DNS load balancer, který dokáže předávat DNS dotazy backendovému DNS resolveru, takže bez ohledu na to, jaký DNS resolver používáte, můžete DNSdist použít ke spuštění vlastního serveru DoH. DNSdist je vyvinut týmem PowerDNS.
Požadavky
Předpokládá se, že máte na serveru Debian spuštěný DNS resolver. Můžete použít jakýkoli DNS resolver (BIND, Knot resolver, Unbound…), já osobně používám BIND.
- Nastavte si svůj vlastní BIND9 DNS Resolver na Debian 10 Buster
Jakmile bude váš DNS resolver spuštěn a spuštěn, postupujte podle níže uvedených pokynů.
Krok 1:Nainstalujte DNSdist na server Debian
Doporučuje se nainstalovat DNSdist z upstream úložiště, takže budete mít nejnovější stabilní verzi. Nejprve musíte vytvořit soubor se seznamem zdrojů pro DNSdist.
Debian 10
echo "deb [arch=amd64] http://repo.powerdns.com/debian buster-dnsdist-16 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Debian 9
echo "deb [arch=amd64] http://repo.powerdns.com/debian stretch-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Dále vytvoříme soubor předvoleb pro DNSdist, abychom balíček připnuli, takže nebudeme omylem instalovat DNSdist z jiného úložiště.
sudo nano /etc/apt/preferences.d/dnsdist
Přidejte do souboru následující řádky.
Package: dnsdist* Pin: origin repo.powerdns.com Pin-Priority: 600
Uložte a zavřete soubor. Poté spusťte následující příkaz pro import veřejného klíče PowerDNS, aby správce balíčků APT mohl ověřit integritu softwarových balíčků stažených z tohoto úložiště.
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -
Dále aktualizujte seznam úložišť a nainstalujte DNSdist.
sudo apt update sudo apt install dnsdist
Ve výchozím nastavení se DNSdist pokouší navázat na port 53. Protože máte existující DNS resolver jako BIND naslouchající na portu 53, dnsdist.service
by se nepodařilo spustit.
Protože právě nasazujeme překladač DoH a nestaráme se o vyvažování zátěže DNS, můžeme nakonfigurovat DNSdist tak, aby naslouchal na jiném portu. Upravte konfigurační soubor DNSdist.
sudo nano /etc/dnsdist/dnsdist.conf
V tomto souboru není žádný obsah. Prozatím jednoduše přidejte do tohoto souboru následující řádek, takže DNSdist bude naslouchat na TCP a UDP portu 5353, namísto portu 53.
setLocal("127.0.0.1:5353")
Uložte a zavřete soubor. Poté restartujte DNSdist.
sudo systemctl restart dnsdist
Zkontrolujte jeho stav.
systemctl status dnsdist
Měl by být aktivní (spuštěný) .
Krok 2:Instalace klienta Let’s Encrypt Client (Certbot) na server Debian
DNS over HTTPS vyžaduje instalaci certifikátu TLS na straně serveru. Získáme a nainstalujeme certifikát Let’s Encrypt. Výhodou použití certifikátu Let’s Encrypt je, že je zdarma, snáze se nastavuje a je důvěryhodný pro klientský software.
Spuštěním následujících příkazů nainstalujte klienta Let’s Encrypt (certbot) z výchozího úložiště Debianu.
sudo apt install certbot
Chcete-li zkontrolovat číslo verze, spusťte
certbot --version
Ukázkový výstup:
certbot 0.31.0
Krok 3:Získejte důvěryhodný certifikát TLS od společnosti Let’s Encrypt
Doporučuji používat standalone
nebo webroot
plugin pro získání certifikátu TLS pro dnsdist.
Samostatný plugin
Pokud na vašem serveru Debianu neběží žádný webový server, můžete k získání certifikátu TLS z Let’s Encrypt použít samostatný plugin. Vytvořte záznam DNS A pro subdoménu (doh.example.com) a poté spusťte následující příkaz.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d doh.example.com
Kde:
certonly
:Získejte certifikát, ale neinstalujte jej.--standalone
:K získání certifikátu použijte samostatný plugin--preferred-challenges http
:Proveďte výzvu http-01 k ověření naší domény, která bude používat port 80.--agree-tos
:Souhlasíte s podmínkami služby Let’s Encrypt.--email
:E-mailová adresa se používá pro registraci a obnovení účtu.-d
:Zadejte název své domény.
Použití pluginu webroot
Pokud má váš server Debian webový server naslouchající na portech 80 a 443, pak je dobré použít k získání certifikátu plugin webroot, protože plugin webroot funguje prakticky s každým webovým serverem a certifikát nemusíme instalovat na webovém serveru.
Nejprve musíte vytvořit virtuálního hostitele pro doh.example.com.
Apache
Pokud používáte Apache, pak
sudo nano /etc/apache2/sites-available/doh.example.com.conf
A vložte do souboru následující řádky.
<VirtualHost *:80> ServerName doh.example.com DocumentRoot /var/www/dnsdist </VirtualHost>
Uložte a zavřete soubor. Poté vytvořte kořenový webový adresář.
sudo mkdir /var/www/dnsdist
Nastavte www-data (uživatel Apache) jako vlastníka webového kořenového adresáře.
sudo chown www-data:www-data /var/www/dnsdist -R
Povolit tohoto virtuálního hostitele.
sudo a2ensite doh.example.com
Znovu načtěte Apache, aby se změny projevily.
sudo systemctl reload apache2
Jakmile je virtuální hostitel vytvořen a povolen, spusťte následující příkaz a získejte certifikát Let’s Encrypt pomocí pluginu webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist
Nginx
Pokud používáte Nginx, pak
sudo nano /etc/nginx/conf.d/doh.example.com.conf
Vložte následující řádky do souboru.
server { listen 80; server_name doh.example.com; root /var/www/dnsdist/; location ~ /.well-known/acme-challenge { allow all; } }
Uložte a zavřete soubor. Poté vytvořte kořenový webový adresář.
sudo mkdir -p /var/www/dnsdist
Nastavte www-data (uživatel Nginx) jako vlastníka webového kořenového adresáře.
sudo chown www-data:www-data /var/www/dnsdist -R
Znovu načtěte Nginx, aby se změny projevily.
sudo systemctl reload nginx
Jakmile je virtuální hostitel vytvořen a povolen, spusťte následující příkaz a získejte certifikát Let’s Encrypt pomocí pluginu webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist
Krok 4:Povolte DoH v DNSdist
Upravte konfigurační soubor DNSdist.
sudo nano /etc/dnsdist/dnsdist.conf
Přidejte do souboru následující řádky.
-- 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"})
Uložte a zavřete soubor. DNSdist běží jako _dnsdist
uživatel, takže musíme zadat _dnsdist
oprávnění uživatele číst certifikát TLS pomocí následujících příkazů.
sudo apt install acl sudo setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/
Poté zkontrolujte syntaxi konfiguračního souboru.
sudo dnsdist --check-config
Pokud je syntaxe v pořádku, restartujte DNSdist.
sudo systemctl restart dnsdist
Všimněte si, že pokud webový server naslouchá na TCP portu 443, DNSdist se nerestartuje. Webový server můžete dočasně zastavit. Na konci tohoto článku vysvětlím, jak přimět webový server a DNSdist používat TCP port 443 současně.
Krok 5:Nakonfigurujte DoH ve webovém prohlížeči Firefox
Přejděte na Předvolby -> Obecné a přejděte dolů a nakonfigurujte Nastavení sítě . Povolte DNS přes HTTPS a nastavte si vlastní překladač DoH.
Poté můžeme doladit konfigurace DoH přechodem na about:config
ve Firefoxu.
network.trr.mode
Ve výchozím nastavení network.
parametr ve Firefoxu je nastaven na 2
, což znamená, že pokud dotaz DoH selže, Firefox předá DNS dotaz hostitelskému systému. Chci vždy používat překladač DoH, takže změňte network.trr.mode
až 3
takže hostitelský resolver nebude použit. To nám umožňuje mít snadný způsob, jak otestovat, zda váš překladač DoH funguje.
network.trr.allow-rfc1918
Toto je nastaveno na false
ve výchozím nastavení, což znamená, že pokud odpověď DNS obsahuje soukromé IP adresy, bude považována za chybnou odpověď, která nebude použita. Pokud v BIND používáte zónu zásad odezvy, pravděpodobně máte některé názvy hostitelů směřující na soukromé IP adresy, pak nastavte tuto hodnotu na true
.
síť.trr.bootstrapAddress
Firefox potřebuje vyhledat IP adresu překladače DoH, aby mohl odesílat dotazy DNS. Do tohoto pole můžete zadat IP adresu, abyste odstranili tento počáteční dotaz.
Testování
Nyní zadejte název domény jako linuxbabe.com
v adresním řádku Firefoxu. Pokud se webová stránka načítá normálně, je to dobré znamení, že váš překladač DoH funguje. Poté přejděte do terminálové konzoly vašeho serveru DNS a zkontrolujte protokoly dotazů DNS. Používám BIND, takže zadám následující příkaz pro kontrolu protokolu dotazů DNS.
sudo journalctl -eu bind9
Jak můžete vidět z níže uvedeného protokolu BIND, Firefox se dotazoval na následující domény.
- www.linuxbabe.com :můj web
- fonts.gstatic.com :Toto zobrazuje písma Google na mém webu
- cdn.shareaholic.net :widget pro sdílení na mém webu
- newsletter.linuxbabe.com :moje vlastní e-mailová marketingová platforma.
- translate.google.com :widget Google Translate na mém webu
Výše uvedený protokol dotazů mi říká, že můj překladač DNS přes HTTPS funguje. Pokud zastavím resolver BIND (sudo systemctl stop named
), Firefox mi říká, že nemůže najít tento web. A když spustím BIND, webová stránka se znovu načte.
Krok 6:Konfigurace klienta DoH na ploše Debianu
Vím, že v systému Linux existují 3 klienti DNS s otevřeným zdrojovým kódem, kteří podporují šifrované DNS.
- vyřešeno systémem
- stubby
- dnscrypt-proxy
Aktuálně dnscrypt-proxy
(verze 2.x) je nejlepší implementací klienta DoH na Linuxu, takže vám ukážu, jak ji používat. Spuštěním následujícího příkazu nainstalujte dnscrypt-proxy
na ploše Debianu.
sudo apt install dnscrypt-proxy
Spustí se automaticky, jak můžete vidět pomocí:
sudo systemctl status dnscrypt-proxy
Pokud se nespustil, můžete jej spustit spuštěním následujícího příkazu.
sudo systemctl enable dnscrypt-proxy --now
Zkontrolujte adresu pro poslech.
sudo ss -lnptu | grep dnscrypt-proxy
Na mém počítači dnscrypt-proxy naslouchá na 127.0.2.1:53
. Existuje další služba systemd (dnscrypt-proxy-resolvconf.service
) nainstalovaný dnscrypt-proxy,
systemctl status dnscrypt-proxy-resolvconf
Toto je služba, která nastavuje 127.0.2.1
jako překladač na vašem počítači. Aktuální překladač DNS pro váš počítač můžete zkontrolovat pomocí:
cat /etc/resolv.conf
Ve výchozím nastavení dnscrypt-proxy používá Clouldflare jako upstream DoH resolver. Chcete-li použít svůj vlastní překladač DoH, upravte konfigurační soubor.
sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml
Najděte následující řádek
server_names = ['cloudflare']
Změňte jej na název hostitele překladače DoH. Všimněte si, že umístění parametrů je důležité. Neměli byste vkládat server_names
parametr na jiných místech v tomto souboru.
server_names = ['doh.example.com']
Poté okomentujte [sources]
sekce.
#[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 = ''
Potřebujeme přidat náš vlastní DoH resolver jako níže v dolní části tohoto souboru.
[static] [static.'doh.example.com'] stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'
Razítko obsahuje název hostitele překladače DoH, IP adresu a cestu dotazu. Chcete-li získat vlastní razítko, použijte online kalkulačku razítek DNS. Jako protokol vyberte DNS-over-HTTPS a zadejte IP adresu, název hostitele a cestu dotazu. Pokud se budete řídit tímto návodem k nastavení vlastního překladače DoH, cesta by měla být nastavena pouze na /
. Pokud jste na svém resolveru nepovolili DNSSEC, zrušte zaškrtnutí políčka DNSSEC.
Jakmile přidáte razítko DNS, uložte a zavřete soubor. Poté restartujte dnscrypt-proxy
.
sudo systemctl restart dnscrypt-proxy
Zkontrolujte jeho stav. Ujistěte se, že běží.
systemctl status dnscrypt-proxy
Nyní můžete otestovat, zda dnscrypt-proxy funguje.
Pokud nechcete světu publikovat svůj překladač DNS přes HTTPS, můžete odstranit záznam DNS A názvu hostitele překladače DoH, protože dnscrypt-proxy má IP adresu v razítku DNS.
Konfigurace DoH v systému iOS
iOS podporuje DNS přes HTTPS od iOS 14. V iOS však neexistuje jednoduchá možnost konfigurace, jak nastavit překladač DoH. Musíte vygenerovat .mobileconfig
soubor a nainstalujte jej na iOS. Je trochu komplikované vygenerovat podepsaný iOS .mobileconfig
soubor.
Pokud váš resolver DoH nebude používán veřejně, můžete vygenerovat jednoduchý nepodepsaný soubor. Pomocí textového editoru vytvořte soubor s .mobileconfig
rozšíření. Zkopírujte a vložte následující text. Nahraďte IP adresu a URL serveru.
<?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>
Uložte a zavřete soubor. Poté můžete soubor odeslat jako přílohu e-mailu do vašeho iOS. Otevřete e-mail na iOS a klepnutím na přílohu stáhněte konfigurační soubor. Poté přejděte do iOS Settings
-> Profile Downloaded
. Zobrazí se výzva k instalaci profilu.
Klepněte na tlačítko Instalovat a zadejte heslo pro iOS pro instalaci. Znovu klepněte na tlačítko Instalovat.
Po instalaci přejděte do Settings
iOS -> VPN & Network
. Přejděte dolů a vyberte překladač DNS pro váš systém iOS. Všimněte si, že tento překladač DoH přepíše překladač DNS poskytovaný sítí VPN, jako je ProtonVPN. Váš iOS bude vždy používat váš překladač DoH.
Pokud někdy budete chtít odstranit .mobileconfig
soubor z iOS, přejděte do Settings
-> General
-> Profile
.
Nastavte DNSdist a webový server, aby používali port 443 současně
Překladač DNS přes HTTPS se musí vázat na port 443. Pokud již Apache/Nginx naslouchá na portu 443, DNSdist se nemůže vázat na port 443. Normálně může port používat pouze jeden proces. Můžeme však použít HAproxy (High Availability Proxy) a SNI (Indikace názvu serveru), aby DNSdist a Apache/Nginx používali port 443 současně.
Konfigurace DNSdist
Upravte konfigurační soubor DNSdist.
sudo nano /etc/dnsdist/dnsdist.conf
Změňte naslouchací adresu DoH na 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 })
Uložte a zavřete soubor. Poté restartujte DNSdist.
sudo systemctl restart dnsdist
Konfigurace Nginx
Pokud používáte Nginx, upravte soubor bloku serveru.
sudo nano /etc/nginx/conf.d/example.com.conf
V bloku serveru SSL najděte následující direktivu.
listen 443 ssl;
Změňte jej na
listen 127.0.0.2:443 ssl;
Tentokrát to posloucháme na 127.0.0.2:443
protože 127.0.0.1:443
je již pořízen DNSdist. Uložte a zavřete soubor. Hlavní konfigurační soubor Nginx /etc/nginx/nginx.conf
a výchozí blok serveru /etc/nginx/sites-enabled/default
může obsahovat výchozí virtuální hostitel naslouchající na 443, takže možná budete muset upravit i tento soubor.
Poté restartujte Nginx.
sudo systemctl restart nginx
Konfigurace Apache
Pokud používáte webový server Apache, upravte soubor virtuálního hostitele.
sudo nano /etc/apache2/sites-enabled/example.com.conf
Ve virtuálním hostiteli SSL změňte
<VirtualHost *:443>
Komu
<VirtualHost 127.0.0.2:443>
Tentokrát to posloucháme na 127.0.0.2:443
protože 127.0.0.1:443
je již pořízen DNSdist. Uložte a zavřete soubor. Poté upravte /etc/apache2/ports.conf
soubor.
sudo nano /etc/apache2/ports.conf
Změnit
Listen 443
Komu
Listen 127.0.0.2:443
Uložte a zavřete soubor. Restartujte Apache.
sudo systemctl restart apache2
Konfigurace HAProxy
Nyní nainstalujte HAproxy.
sudo apt install haproxy
Spusťte HAProxy
sudo systemctl start haproxy
Upravit konfigurační soubor.
sudo nano /etc/haproxy/haproxy.cfg
Pokud používáte Nginx , zkopírujte a vložte následující řádky na konec souboru. Nahraďte 12.34.56.78
s veřejnou IP adresou vašeho serveru. Nahraďte doh.example.com
s názvem domény používaný DNSdist a www.example.com
s názvem domény používané vaším webovým serverem.
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
Pokud používáte Apache , zkopírujte a vložte následující řádky na konec souboru. Nahraďte 12.34.56.78
s veřejnou IP adresou vašeho serveru. Nahraďte doh.example.com
s názvem domény používaný DNSdist a www.example.com
s názvem domény používané vaším webovým serverem.
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
Uložte a zavřete soubor. Poté restartujte HAproxy.
sudo systemctl restart haproxy
Ve výše uvedené konfiguraci jsme použili funkci SNI (Server Name Indication) v TLS k rozlišení provozu VPN a běžného provozu HTTPS.
- Když
doh.example.com
je v klientovi TLS Dobrý den, HAProxy přesměruje provoz na backend DNSdist. - Když
www.example.com
je v klientovi TLS Dobrý den, HAProxy přesměruje provoz na backend Apache/nginx. - Pokud klient neuvede název serveru v TLS Client Hello, pak HAproxy použije výchozí backend (DNSdist).
Toto nastavení můžete otestovat pomocí openssl
nářadí. Nejprve spusťte následující příkaz několikrát.
echo | openssl s_client -connect your-server-IP:443 | grep subject
Ve výše uvedeném příkazu jsme nespecifikovali název serveru, takže HAproxy vždy předá požadavek výchozímu backendu (DNSdist) a jeho certifikát bude odeslán klientovi. Dále spusťte následující dva příkazy.
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
Nyní jsme v příkazech zadali název serveru, takže HAproxy bude předávat požadavky podle pravidel SNI, která jsme definovali.
Při obnově certifikátu Let’s Encrypt pro váš web se doporučuje použít http-01
výzva namísto tls-alpn-01
problém, protože HAproxy naslouchá na portu 443 veřejné IP adresy, takže může rušit proces obnovy.
sudo certbot renew --preferred-challenges http-01