GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Configura il risolutore DNS su HTTPS (DoH) su Ubuntu con DNSdist

Questo tutorial ti mostrerà come configurare il tuo DNS su HTTPS (DoH) risolutore su Ubuntu con DNSdist, così le tue query DNS possono essere crittografate e protette da occhi indiscreti.

Cos'è il DNS su HTTPS e perché è importante

Il DNS (Domain Name System) è responsabile della traduzione dei nomi di dominio in indirizzi IP. È stato progettato nel 1987 senza alcuna sicurezza o privacy in mente. Per impostazione predefinita, le query DNS non sono crittografate. Vengono inviati in chiaro sul filo e possono essere sfruttati da entità intermedie. Ad esempio, il Great Firewall cinese (GFW ) utilizza una tecnica chiamata DNS cache poison censurare Internet cinese. (Usano anche altri metodi, che esulano dallo scopo di questo articolo.)

GFW controlla ogni query DNS inviata a un server DNS al di fuori della Cina. Poiché il protocollo DNS in testo normale si basa su UDP, che è un protocollo senza connessione, GFW può falsificare sia l'IP del client che l'IP del server. Quando GFW trova un nome di dominio nella sua lista di blocco, cambia la risposta DNS. Ad esempio, se un utente Internet cinese desidera visitare google.com, GFW restituisce un indirizzo IP situato in Cina anziché l'indirizzo IP reale di Google al risolutore DNS dell'utente. Quindi il resolver DNS restituisce l'indirizzo IP falso al computer dell'utente, quindi l'utente non può visitare google.com.

HTTPS è il modo standard per crittografare le pagine Web HTTP in testo normale. Con DNS su HTTPS (DoH), le tue query DNS verranno crittografate, quindi nessuna terza parte potrà vedere le tue query DNS.

Perché eseguire il proprio risolutore DoH?

Esistono già alcuni resolver DNS pubblici come 1.1.1.1 e 9.9.9.9 che supportano DNS su HTTPS, quindi puoi usarli se non hai le competenze o il tempo per eseguirne uno. A partire dalla versione 61 di Firefox, puoi abilitare DNS su HTTPS nelle impostazioni del browser, il che rappresenta un grande progresso per la sicurezza e la privacy di Internet. Firefox utilizza i resolver Cloudflare (1.1.1.1) per impostazione predefinita. Tuttavia, alcune persone sostengono che ciò consente a Cloudflare di raccogliere informazioni sugli utenti di Firefox. Sembrano avere più fiducia nel loro ISP rispetto a Cloudflare. Ma penso che se sei paranoico sulla privacy, dovresti eseguire il tuo risolutore DoH, quindi né Cloudflare né il tuo ISP possono spiarti.

DoH vs DoT

Oltre a DNS su HTTPS, esiste un altro protocollo che mira anche a crittografare le query DNS. Si chiama DNS su TLS (Punto). In precedenza ho scritto una guida all'uso di DNS su TLS su desktop Ubuntu, ma ora sto passando a DNS su HTTPS.

Per le persone che vivono in paesi con una severa censura su Internet come la Cina, è più vantaggioso utilizzare DoH.

  • DoT opera sulla porta TCP 853 , che può essere facilmente bloccato da un firewall nazionale.
  • DoH opera sulla porta TCP 443 , che è la porta standard per i siti Web HTTPS, il che rende estremamente difficile bloccare DoH, perché se la porta TCP 443 è bloccata, verranno bloccati anche quasi tutti i siti Web HTTPS.

Il mio risolutore DoH è in esecuzione su un VPS (server privato virtuale) situato al di fuori della Cina e il Great Firewall cinese non può intercettare le mie query DNS. Posso persino nascondere l'indirizzo IP del mio resolver DoH dietro Cloudflare CDN (Content Delivery Network).

Un altro vantaggio di DoH è che consente alle applicazioni Web di accedere alle informazioni DNS tramite le API del browser esistenti, quindi non è necessario alcun risolutore di stub.

Supporto DoH nei principali resolver DNS

  • LEGGERA supporterà DoH nella versione 9.17, che è ancora in fase di sviluppo. Il repository Ubuntu 20.04 e 21.04 viene fornito con BIND 9.16.
  • Nodo risolutore supporta DoH dalla versione 4.0.0. L'ultima versione corrente è 5.11. Ha un repository ufficiale per Debian, Ubuntu, CentOS, Fedora.
  • Non vincolato supporta DoH dalla versione 1.12.0.
  • Ricorrente PowerDNS al momento non supporta DoH.

In realtà, preferisco eseguire il risolutore DoH con DNSDist , che ha aggiunto il supporto DoH nella versione 1.4.0. L'ultima versione corrente è 1.5. Ha un repository ufficiale per Debian, Raspbian, Ubuntu e CentOS. DNSdist è un sistema di bilanciamento del carico DNS in grado di inoltrare query DNS a un risolutore DNS di back-end, quindi indipendentemente dal risolutore DNS in uso, puoi utilizzare DNSdist per eseguire il tuo server DoH. DNSdist è sviluppato dal team di PowerDNS.

Prerequisiti

Si presume che tu abbia un risolutore DNS in esecuzione sul tuo server Ubuntu. Puoi usare qualsiasi risolutore DNS (BIND, Knot resolver, Unbound...) Io personalmente uso BIND.

  • Configura il tuo risolutore DNS BIND9 su Ubuntu 16.04/18.04
  • Configura il tuo risolutore DNS BIND9 su Ubuntu 20.04

Una volta che il tuo risolutore DNS è attivo e funzionante, segui le istruzioni seguenti.

Passaggio 1:installa DNSdist su Ubuntu Server

Se usi un Ubuntu non LTS , devi installare dnsdist dal repository predefinito (sudo apt install dnsdist ). Se utilizzi Ubuntu LTS , si consiglia di installare DNSdist dal repository a monte, in modo da avere l'ultima versione stabile. Innanzitutto, devi creare un file di elenco di origine per 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

Successivamente, creiamo un file delle preferenze per DNSdist per bloccare il pacchetto, quindi non installeremo accidentalmente DNSdist da un altro repository.

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

Aggiungi le seguenti righe nel file.

Package: dnsdist*
Pin: origin repo.powerdns.com
Pin-Priority: 600

Salva e chiudi il file. Quindi esegui il comando seguente per importare la chiave pubblica PowerDNS, in modo che il gestore di pacchetti APT possa verificare l'interità dei pacchetti software scaricati da questo repository.

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

Quindi, aggiorna l'elenco dei repository e installa DNSdist.

sudo apt update

sudo apt install dnsdist

Per impostazione predefinita, DNSdist tenta di collegarsi alla porta 53. Poiché hai un resolver DNS esistente come BIND in ascolto sulla porta 53, dnsdist.service non si avvia.

Poiché stiamo solo implementando un resolver DoH e non ci interessa il bilanciamento del carico DNS, possiamo configurare DNSdist per l'ascolto su un'altra porta. Modifica il file di configurazione DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Non ci sono contenuti in questo file. Per ora, aggiungi semplicemente la seguente riga a questo file, così DNSdist ascolterà sulla porta TCP e UDP 5353, invece della porta 53.

setLocal("127.0.0.1:5353")

Salva e chiudi il file. Quindi riavvia DNSdist.

sudo systemctl restart dnsdist

Controlla il suo stato.

systemctl status dnsdist

Dovrebbe essere attivo (in esecuzione) .

Passaggio 2:installa Let's Encrypt Client (Certbot) su Ubuntu Server

DNS su HTTPS richiede l'installazione di un certificato TLS sul lato server. Otterremo e installeremo il certificato Let's Encrypt. Il vantaggio dell'utilizzo del certificato Let's Encrypt è che è gratuito, più facile da configurare e considerato affidabile dal software client.

Esegui i seguenti comandi per installare il client Let's Encrypt (certbot) dal repository Ubuntu predefinito.

sudo apt install certbot

Per controllare il numero di versione, esegui

certbot --version

Esempio di output:

certbot 0.40.0

Fase 3:ottieni un certificato TLS affidabile da Let's Encrypt

Consiglio di utilizzare il standalone o webroot plug-in per ottenere il certificato TLS per dnsdist.

Plugin autonomo

Se non è presente alcun server Web in esecuzione sul tuo server Ubuntu, puoi utilizzare il plug-in autonomo per ottenere il certificato TLS da Let's Encrypt. Crea un record DNS A per il sottodominio (doh.example.com), quindi esegui il comando seguente.

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d doh.example.com

Dove:

  • certonly :Ottieni un certificato ma non installarlo.
  • --standalone :usa il plugin standalone per ottenere un certificato
  • --preferred-challenges http :esegui la verifica http-01 per convalidare il nostro dominio, che utilizzerà la porta 80.
  • --agree-tos :Accetta i termini di servizio di Let's Encrypt.
  • --email :l'indirizzo e-mail viene utilizzato per la registrazione e il recupero dell'account.
  • -d :Specifica il tuo nome di dominio.

Come puoi vedere dallo screenshot seguente, ho ottenuto con successo il certificato.

Utilizzo del plug-in webroot

Se il tuo server Ubuntu ha un server web in ascolto sulle porte 80 e 443, allora è una buona idea usare il plugin webroot per ottenere un certificato perché il plugin webroot funziona praticamente con tutti i web server e non abbiamo bisogno di installare il certificato nel server web.

Innanzitutto, devi creare un host virtuale per doh.example.com.

Apache

Se stai usando Apache, allora

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

E incolla le seguenti righe nel file.

<VirtualHost *:80>        
        ServerName doh.example.com

        DocumentRoot /var/www/dnsdist
</VirtualHost>

Salva e chiudi il file. Quindi crea la directory principale web.

sudo mkdir /var/www/dnsdist

Imposta www-data (utente Apache) come proprietario della radice web.

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

Abilita questo host virtuale.

sudo a2ensite doh.example.com

Ricarica Apache per rendere effettive le modifiche.

sudo systemctl reload apache2

Una volta creato e abilitato l'host virtuale, esegui il comando seguente per ottenere il certificato Let's Encrypt utilizzando il plug-in webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist

Nginx

Se stai usando Nginx, allora

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

Incolla le seguenti righe nel file.

server {
      listen 80;
      server_name doh.example.com;

      root /var/www/dnsdist/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

Salva e chiudi il file. Quindi crea la directory principale web.

sudo mkdir -p /var/www/dnsdist

Imposta www-data (utente Nginx) come proprietario della radice web.

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

Ricarica Nginx per rendere effettive le modifiche.

sudo systemctl reload nginx

Una volta creato e abilitato l'host virtuale, esegui il comando seguente per ottenere il certificato Let's Encrypt utilizzando il plug-in webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist

Fase 4:abilita DoH in DNSdist

Modifica il file di configurazione DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Aggiungi le seguenti righe nel 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"})

Salva e chiudi il file. DNSdist viene eseguito come _dnsdist utente, quindi dobbiamo fornire il _dnsdist autorizzazione utente per leggere il certificato TLS con i seguenti comandi.

sudo apt install acl

sudo setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

Quindi controlla la sintassi del file di configurazione.

sudo dnsdist --check-config

Se la sintassi è corretta, riavvia DNSdist.

sudo systemctl restart dnsdist

Si noti che se è presente un server Web in ascolto sulla porta TCP 443, DNSdist non si riavvierà. È possibile interrompere temporaneamente il server web. Spiegherò come fare in modo che il server Web e DNSdist utilizzino la porta TCP 443 contemporaneamente alla fine di questo articolo.

Quando Certbot rinnova il certificato TLS, devi concedere nuovamente l'autorizzazione, ma puoi aggiungere il comando nel file crontab.

sudo crontab -e

In questo modo:

@daily certbot renew --quiet && setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

Passaggio 5:Configura DoH nel browser Web Firefox

Vai a Preferenze -> Generale e scorri verso il basso per configurare le Impostazioni di rete . Abilita DNS su HTTPS e imposta il tuo risolutore DoH.

Possiamo quindi mettere a punto le configurazioni DoH andando su about:config scheda in Firefox.

network.trr.mode

Per impostazione predefinita, la network.trr.mode parametro in Firefox è impostato su 2 , il che significa che se la query DoH non riesce, Firefox passerà la query DNS al sistema host. Voglio usare sempre il risolutore DoH, quindi cambia il network.trr.mode a 3 quindi il risolutore host non verrà utilizzato. Questo ci consente di avere un modo semplice per verificare se il tuo resolver DoH funziona.

network.trr.allow-rfc1918

Questo è impostato su false per impostazione predefinita, il che significa che se la risposta DNS include indirizzi IP privati, verrà considerata una risposta errata che non verrà utilizzata. Se utilizzi la response policy zone in BIND, probabilmente hai alcuni nomi host che puntano a indirizzi IP privati, quindi imposta questo valore su true .

rete.trr.bootstrapAddress

Firefox deve cercare l'indirizzo IP del resolver DoH per inviare query DNS. Puoi inserire l'indirizzo IP in questo campo per eliminare questa richiesta iniziale.

Test

Ora inserisci un nome di dominio come linuxbabe.com nella barra degli indirizzi di Firefox. Se la pagina Web viene caricata normalmente, è un buon segno che il tuo resolver DoH funziona. Quindi vai alla console del terminale del tuo server DNS e controlla i registri delle query DNS. Uso BIND, quindi inserisco il seguente comando per controllare il registro delle query DNS.

Ubuntu 20.04

sudo journalctl -eu named

Ubuntu 18.04

sudo journalctl -eu bind9

Come puoi vedere dal registro BIND di seguito, Firefox ha interrogato i seguenti domini.

  • www.linuxbabe.com :il mio sito web
  • fonts.gstatic.com :serve i caratteri Google sul mio sito web
  • cdn.shareaholic.net :un widget di condivisione sul mio sito web
  • newsletter.linuxbabe.com :la mia piattaforma di email marketing self-hosted.
  • translate.google.com :il widget di Google Translate sul mio sito web

Il registro delle query sopra mi dice che il mio risolutore DNS su HTTPS funziona. Se interrompo il risolutore BIND (sudo systemctl stop named ), Firefox mi dice che non riesce a trovare quel sito. E quando avvio BIND, la pagina web si carica di nuovo.

Passaggio 6:Configura il client DoH sul desktop Ubuntu

So che ci sono 3 client DNS open source su Linux che supportano DNS crittografato.

  • Risolto dal sistema
  • tozzo
  • dnscrypt-proxy

Attualmente, dnscrypt-proxy è la migliore implementazione client DoH su Linux, quindi ti mostrerò come usarla. Esegui il comando seguente per installare dnscrypt-proxy sul tuo desktop Ubuntu.

sudo apt install dnscrypt-proxy

Si avvierà automaticamente, come puoi vedere con:

sudo systemctl status dnscrypt-proxy

Se non si avvia, puoi eseguire il comando seguente per avviarlo.

sudo systemctl enable dnscrypt-proxy --now

Controlla l'indirizzo di ascolto.

sudo ss -lnptu | grep dnscrypt-proxy

Sul mio computer, dnscrypt-proxy è in ascolto su 127.0.2.1:53 . C'è un altro servizio systemd (dnscrypt-proxy-resolvconf.service ) installato da dnscrypt-proxy,

systemctl status dnscrypt-proxy-resolvconf

Questo è un servizio che imposta 127.0.2.1 come risolutore sul tuo computer. Puoi controllare l'attuale risolutore DNS per il tuo computer con:

cat /etc/resolv.conf

Per impostazione predefinita, dnscrypt-proxy utilizza Clouldflare come risolutore DoH a monte. Per utilizzare il tuo risolutore DoH, modifica il file di configurazione.

sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml

Trova la riga seguente

server_names = ['cloudflare']

Cambialo nel nome host del tuo risolutore DoH. Si noti che la posizione dei parametri è importante. Non dovresti inserire i server_names parametro in altri punti di questo file.

server_names = ['doh.example.com']

Quindi commenta il [sources] sezione.

#[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 = ''

Dobbiamo aggiungere il nostro risolutore DoH come di seguito in fondo a questo file.

[static]  
  [static.'doh.example.com']
  stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'

Il timbro contiene il nome host del risolutore DoH, l'indirizzo IP e il percorso della query. Per ottenere il tuo timbro, usa il calcolatore di timbri DNS online. Scegli DNS-over-HTTPS come protocollo e inserisci l'indirizzo IP, il nome host e il percorso della query. Se segui questo tutorial per configurare il tuo resolver DoH, il percorso dovrebbe essere impostato solo su / . Se non hai abilitato DNSSEC sul tuo resolver, deseleziona la casella di controllo DNSSEC.

Dopo aver aggiunto il timbro DNS, salva e chiudi il file. Quindi riavvia dnscrypt-proxy .

sudo systemctl restart dnscrypt-proxy

Controlla il suo stato. Assicurati che sia in esecuzione.

systemctl status dnscrypt-proxy

Ora puoi verificare se dnscrypt-proxy funziona.

Se non desideri pubblicare il tuo risolutore DNS su HTTPS nel mondo, puoi eliminare il record DNS A del nome host del tuo risolutore DoH, perché dnscrypt-proxy ha l'indirizzo IP nel timbro DNS.

Configura DoH su iOS

iOS supporta DNS su HTTPS da iOS 14. Tuttavia, non esiste una semplice opzione di configurazione su iOS per impostare il resolver DoH. Devi generare un .mobileconfig file e installalo su iOS. È un po' complicato generare un .mobileconfig iOS firmato file.

Se il tuo risolutore DoH non verrà utilizzato pubblicamente, puoi generare un semplice file non firmato. Usa un editor di testo per creare un file con .mobileconfig estensione. Copia e incolla il testo seguente. Sostituisci l'indirizzo IP e l'URL del 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>

Salva e chiudi il file. Quindi puoi inviare il file come allegato e-mail al tuo iOS. Apri l'e-mail su iOS e tocca l'allegato per scaricare il file di configurazione. Successivamente, vai su Settings di iOS -> Profile Downloaded . Ti verrà chiesto di installare il profilo.

Tocca il pulsante Installa e inserisci la tua password iOS per installarla. Tocca di nuovo il pulsante Installa.

Una volta installato, vai su Settings di iOS -> VPN & Network . Scorri verso il basso fino al pulsante per scegliere il risolutore DNS per il tuo sistema iOS. Nota che questo resolver DoH sovrascriverà il resolver DNS fornito da una VPN come ProtonVPN. Il tuo iOS utilizzerà sempre il tuo risolutore DoH.

Se mai vuoi rimuovere il .mobileconfig file da iOS, vai su Settings -> General -> Profile .

Fai in modo che DNSdist e il server web utilizzino la porta 443 contemporaneamente

Un risolutore DNS su HTTPS deve collegarsi alla porta 443. Se hai già Apache/Nginx in ascolto sulla porta 443, DNSdist non può collegarsi alla porta 443. Normalmente una porta può essere utilizzata solo da un processo. Tuttavia, possiamo utilizzare HAproxy (High Availability Proxy) e SNI (Server Name Indication) per fare in modo che DNSdist e Apache/Nginx utilizzino la porta 443 contemporaneamente.

Configurazione DNSdist

Modifica il file di configurazione DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Modifica l'indirizzo di ascolto DoH in 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 })

Salva e chiudi il file. Quindi riavvia DNSdist.

sudo systemctl restart dnsdist

Configurazione Nginx

Se usi Nginx, modifica il file di blocco del server.

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

Nel blocco del server SSL, trova la seguente direttiva.

listen 443 ssl;

Cambialo in

listen 127.0.0.2:443 ssl;

Questa volta lo facciamo ascoltare su 127.0.0.2:443 perché 127.0.0.1:443 è già preso da DNSdist. Salva e chiudi il file. Il file di configurazione principale di Nginx /etc/nginx/nginx.conf e il blocco server predefinito /etc/nginx/sites-enabled/default potrebbe includere un host virtuale predefinito in ascolto su 443, quindi potrebbe essere necessario modificare anche questo file.

Quindi riavvia Nginx.

sudo systemctl restart nginx

Configurazione di Apache

Se utilizzi il server Web Apache, modifica il file dell'host virtuale.

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

Nell'host virtuale SSL, cambia

<VirtualHost *:443>

A

<VirtualHost 127.0.0.2:443>

Questa volta lo facciamo ascoltare su 127.0.0.2:443 perché 127.0.0.1:443 è già preso da DNSdist. Salva e chiudi il file. Quindi modifica il /etc/apache2/ports.conf file.

sudo nano /etc/apache2/ports.conf

Cambia

Listen 443

A

Listen 127.0.0.2:443

Salva e chiudi il file. Riavvia Apache.

sudo systemctl restart apache2

Configurazione HAProxy

Ora installa HAproxy.

sudo apt install haproxy

Avvia HAProxy

sudo systemctl start haproxy

Modifica file di configurazione.

sudo nano /etc/haproxy/haproxy.cfg

Se usi Nginx , copia e incolla le seguenti righe alla fine del file. Sostituisci 12.34.56.78 con l'indirizzo IP pubblico del tuo server. Sostituisci doh.example.com con il nome di dominio utilizzato da DNSdist e www.example.com con il nome di dominio utilizzato dal tuo server web.

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

Se usi Apache , copia e incolla le seguenti righe alla fine del file. Sostituisci 12.34.56.78 con l'indirizzo IP pubblico del tuo server. Sostituisci doh.example.com con il nome di dominio utilizzato da DNSdist e www.example.com con il nome di dominio utilizzato dal tuo server web.

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

Salva e chiudi il file. Quindi riavvia HAproxy.

sudo systemctl restart haproxy

Nella configurazione sopra, abbiamo utilizzato la funzione SNI (Server Name Indication) in TLS per differenziare il traffico VPN e il normale traffico HTTPS.

  • Quando doh.example.com è nel client TLS Hello, HAProxy reindirizza il traffico al backend DNSdist.
  • Quando www.example.com è nel client TLS Hello, HAProxy reindirizza il traffico al backend apache/nginx.
  • Se il client non specifica il nome del server in TLS Client Hello, HAproxy utilizzerà il backend predefinito (DNSdist).

Puoi testare questa configurazione con openssl attrezzo. Innanzitutto, esegui il seguente comando più volte.

echo | openssl s_client -connect your-server-IP:443 | grep subject

Non abbiamo specificato il nome del server nel comando precedente, quindi HAproxy passerà sempre la richiesta al back-end predefinito (DNSdist) e il suo certificato verrà inviato al client. Quindi, esegui i seguenti due comandi.

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

Ora abbiamo specificato il nome del server nei comandi, quindi HAproxy passerà le richieste in base alle regole SNI che abbiamo definito.

Quando rinnovi il certificato Let's Encrypt per il tuo sito web, ti consigliamo di utilizzare il http-01 challenge invece di tls-alpn-01 sfida, perché HAproxy è in ascolto sulla porta 443 dell'indirizzo IP pubblico, quindi può interferire con il processo di rinnovo.

sudo certbot renew --preferred-challenges http-01

Ubuntu
  1. Come configurare un firewall con UFW su Ubuntu 18.04

  2. Come proteggere Nginx con Lets Encrypt su Ubuntu 20.04 / 18.04

  3. Come impostare il server dei nomi DNS su Ubuntu 20.04

  4. Come configurare il risolutore DNS locale utilizzando Dnsmasq su Ubuntu 20.04

  5. Come configurare un risolutore DNS non legato su Ubuntu 20.04

Come configurare facilmente un DNS su TLS Resolver con Nginx su Ubuntu

Come configurare Quad 9 DNS su Ubuntu 16.04 e Ubuntu 17.10 Desktop

Configura un risolutore DNS locale su Ubuntu 18.04, 16.04 con BIND9

Configura il risolutore DNS locale su Ubuntu 20.04 con BIND9

Imposta un risolutore DNS non legato sul server Ubuntu 20.04

Configura il server Ubuntu con EHCP (LAMP, DNS, FTP, Mail)