Dieses Tutorial zeigt Ihnen, wie Sie Ihr eigenes DNS über HTTPS einrichten (DoH)Resolver auf Ubuntu mit DNSdist, damit Ihre DNS-Abfragen verschlüsselt und vor neugierigen Blicken geschützt werden können.
Was ist DNS über HTTPS und warum ist es wichtig
DNS (Domain Name System) ist für die Übersetzung von Domainnamen in IP-Adressen zuständig. Es wurde 1987 ohne Rücksicht auf Sicherheit oder Privatsphäre entwickelt. Standardmäßig werden DNS-Abfragen nicht verschlüsselt. Sie werden im Klartext über die Leitung gesendet und können von Mittelinstanzen ausgenutzt werden. Zum Beispiel die Great Firewall of China (GFW ) verwendet eine Technik namens DNS-Cache-Poison das chinesische Internet zu zensieren. (Sie verwenden auch andere Methoden, die den Rahmen dieses Artikels sprengen würden.)
GFW prüft jede DNS-Anfrage, die an einen DNS-Server außerhalb Chinas gesendet wird. Da das Klartext-DNS-Protokoll auf UDP basiert, einem verbindungslosen Protokoll, kann GFW sowohl die Client-IP als auch die Server-IP fälschen. Wenn GFW einen Domainnamen auf seiner Sperrliste findet, ändert es die DNS-Antwort. Wenn beispielsweise ein chinesischer Internetnutzer google.com besuchen möchte, gibt GFW anstelle der echten IP-Adresse von Google eine in China befindliche IP-Adresse an den DNS-Resolver des Nutzers zurück. Dann gibt der DNS-Resolver die gefälschte IP-Adresse an den Computer des Benutzers zurück, sodass der Benutzer google.com nicht besuchen kann.
HTTPS ist die Standardmethode zum Verschlüsseln von Klartext-HTTP-Webseiten. Mit DNS über HTTPS (DoH) werden Ihre DNS-Abfragen verschlüsselt, sodass Dritte Ihre DNS-Abfragen nicht sehen können.
Warum einen eigenen DoH-Resolver betreiben?
Es gibt bereits einige öffentliche DNS-Resolver wie 1.1.1.1
und 9.9.9.9
die DNS über HTTPS unterstützen, sodass Sie sie verwenden können, wenn Sie nicht über die Fähigkeiten oder die Zeit verfügen, Ihre eigenen auszuführen. Ab Firefox-Version 61 können Sie DNS über HTTPS in den Browsereinstellungen aktivieren, was ein großer Fortschritt für die Internetsicherheit und den Datenschutz ist. Firefox verwendet standardmäßig Cloudflare-Resolver (1.1.1.1). Einige Leute argumentieren jedoch, dass Cloudflare dadurch Informationen über Firefox-Benutzer sammeln kann. Sie scheinen ihrem ISP mehr zu vertrauen als Cloudflare. Aber ich denke, wenn Sie in Bezug auf den Datenschutz paranoid sind, sollten Sie Ihren eigenen DoH-Resolver betreiben, damit weder Cloudflare noch Ihr ISP Sie ausspionieren können.
DoH vs. DoT
Neben DNS über HTTPS gibt es ein weiteres Protokoll, das ebenfalls darauf abzielt, DNS-Anfragen zu verschlüsseln. Es heißt DNS über TLS (Punkt). Zuvor habe ich eine Anleitung zur Verwendung von DNS über TLS auf dem Ubuntu-Desktop geschrieben, aber jetzt wechsle ich zu DNS über HTTPS.
Für Menschen, die in Ländern mit strenger Internetzensur wie China leben, ist es vorteilhafter, DoH zu verwenden.
- DoT arbeitet auf TCP-Port 853 , die leicht von einer nationalen Firewall blockiert werden kann.
- DoH arbeitet auf TCP-Port 443 , das ist der Standardport für HTTPS-Websites, wodurch DoH sehr schwer zu blockieren ist, denn wenn TCP-Port 443 blockiert wird, werden auch fast alle HTTPS-Websites blockiert.
Mein DoH-Resolver läuft auf einem VPS (Virtual Private Server) außerhalb Chinas und die Great Firewall of China kann meine DNS-Abfragen nicht abfangen. Ich kann sogar die IP-Adresse meines DoH-Resolvers hinter Cloudflare CDN (Content Delivery Network) verbergen.
Ein weiterer Vorteil von DoH besteht darin, dass Webanwendungen über vorhandene Browser-APIs auf DNS-Informationen zugreifen können, sodass kein Stub-Resolver erforderlich ist.
DoH-Unterstützung in wichtigen DNS-Resolvern
- BINDEN wird DoH in der noch in Entwicklung befindlichen Version 9.17 unterstützen. Ubuntu 20.04 und 21.04 Repository werden mit BIND 9.16 ausgeliefert.
- Knoten Resolver unterstützt DoH seit Version 4.0.0. Die aktuell neueste Version ist 5.11. Es hat ein offizielles Repository für Debian, Ubuntu, CentOS, Fedora.
- Ungebunden unterstützt DoH seit Version 1.12.0.
- PowerDNS-Rekursor unterstützt derzeit kein DoH.
Eigentlich ziehe ich es vor, den DoH-Resolver mit DNSdist auszuführen , die DoH-Unterstützung in Version 1.4.0 hinzugefügt hat. Die aktuell neueste Version ist 1.5. Es hat ein offizielles Repository für Debian, Raspbian, Ubuntu und CentOS. DNSdist ist ein DNS-Load-Balancer, der DNS-Abfragen an einen Backend-DNS-Resolver weiterleiten kann. Unabhängig davon, welchen DNS-Resolver Sie verwenden, können Sie mit DNSdist Ihren eigenen DoH-Server betreiben. DNSdist wird vom PowerDNS-Team entwickelt.
Voraussetzungen
Es wird davon ausgegangen, dass auf Ihrem Ubuntu-Server ein DNS-Resolver ausgeführt wird. Sie können jeden DNS-Resolver (BIND, Knot-Resolver, Unbound…) verwenden. Ich persönlich verwende BIND.
- Richten Sie Ihren eigenen BIND9-DNS-Resolver auf Ubuntu 16.04/18.04 ein
- Richten Sie Ihren eigenen BIND9-DNS-Resolver unter Ubuntu 20.04 ein
Sobald Ihr DNS-Resolver betriebsbereit ist, befolgen Sie die nachstehenden Anweisungen.
Schritt 1:DNSdist auf Ubuntu-Server installieren
Wenn Sie ein Nicht-LTS-Ubuntu verwenden müssen Sie dnsdist aus dem Standard-Repository installieren (sudo apt install dnsdist
). Wenn Sie Ubuntu LTS verwenden , wird empfohlen, DNSdist aus dem Upstream-Repository zu installieren, damit Sie die neueste stabile Version haben. Zuerst müssen Sie eine Quelllistendatei für DNSdist erstellen.
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
Als Nächstes erstellen wir eine Einstellungsdatei für DNSdist, um das Paket anzuheften, damit wir DNSdist nicht versehentlich aus einem anderen Repository installieren.
sudo nano /etc/apt/preferences.d/dnsdist
Fügen Sie die folgenden Zeilen in die Datei ein.
Package: dnsdist* Pin: origin repo.powerdns.com Pin-Priority: 600
Speichern und schließen Sie die Datei. Führen Sie dann den folgenden Befehl aus, um den öffentlichen PowerDNS-Schlüssel zu importieren, damit der APT-Paketmanager die Interität der aus diesem Repository heruntergeladenen Softwarepakete überprüfen kann.
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -
Aktualisieren Sie als Nächstes die Repository-Liste und installieren Sie DNSdist.
sudo apt update sudo apt install dnsdist
Standardmäßig versucht DNSdist, sich an Port 53 zu binden. Da Sie einen vorhandenen DNS-Resolver wie BIND haben, der Port 53 überwacht, wird dnsdist.service
verwendet würde nicht starten.
Da wir nur einen DoH-Resolver bereitstellen und uns nicht um den DNS-Lastausgleich kümmern, können wir DNSdist so konfigurieren, dass es auf einem anderen Port lauscht. Bearbeiten Sie die DNSdist-Konfigurationsdatei.
sudo nano /etc/dnsdist/dnsdist.conf
Diese Datei enthält keinen Inhalt. Fügen Sie vorerst einfach die folgende Zeile in diese Datei ein, damit DNSdist auf TCP- und UDP-Port 5353 statt auf Port 53 lauscht.
setLocal("127.0.0.1:5353")
Speichern und schließen Sie die Datei. Starten Sie dann DNSdist neu.
sudo systemctl restart dnsdist
Überprüfen Sie den Status.
systemctl status dnsdist
Es sollte aktiv (laufend) sein .
Schritt 2:Let’s Encrypt Client (Certbot) auf Ubuntu Server installieren
DNS über HTTPS erfordert die Installation eines TLS-Zertifikats auf der Serverseite. Wir werden das Let’s Encrypt-Zertifikat erhalten und installieren. Der Vorteil der Verwendung des Let’s Encrypt-Zertifikats besteht darin, dass es kostenlos, einfacher einzurichten und von der Client-Software als vertrauenswürdig eingestuft wird.
Führen Sie die folgenden Befehle aus, um den Let’s Encrypt-Client (certbot) aus dem standardmäßigen Ubuntu-Repository zu installieren.
sudo apt install certbot
Um die Versionsnummer zu prüfen, führen Sie
auscertbot --version
Beispielausgabe:
certbot 0.40.0
Schritt 3:Erhalten Sie ein vertrauenswürdiges TLS-Zertifikat von Let’s Encrypt
Ich empfehle die Verwendung des standalone
oder webroot
Plugin zum Abrufen des TLS-Zertifikats für dnsdist.
Eigenständiges Plugin
Wenn auf Ihrem Ubuntu-Server kein Webserver läuft, können Sie das eigenständige Plugin verwenden, um ein TLS-Zertifikat von Let’s Encrypt zu erhalten. Erstellen Sie einen DNS-A-Eintrag für die Subdomain (doh.example.com) und führen Sie dann den folgenden Befehl aus.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d doh.example.com
Wo:
certonly
:Erhalten Sie ein Zertifikat, aber installieren Sie es nicht.--standalone
:Verwenden Sie das eigenständige Plugin, um ein Zertifikat zu erhalten--preferred-challenges http
:Führen Sie eine http-01-Abfrage durch, um unsere Domäne zu validieren, die Port 80 verwendet.--agree-tos
:Stimmen Sie den Nutzungsbedingungen von Let’s Encrypt zu.--email
:Die E-Mail-Adresse wird für die Kontoregistrierung und -wiederherstellung verwendet.-d
:Geben Sie Ihren Domänennamen an.
Wie Sie dem folgenden Screenshot entnehmen können, habe ich das Zertifikat erfolgreich erhalten.
Verwendung des Webroot-Plugins
Wenn Ihr Ubuntu-Server einen Webserver hat, der Port 80 und 443 überwacht, dann ist es eine gute Idee, das Webroot-Plugin zu verwenden, um ein Zertifikat zu erhalten, da das Webroot-Plugin mit so ziemlich jedem Webserver funktioniert und wir das Zertifikat nicht installieren müssen im Webserver.
Zuerst müssen Sie einen virtuellen Host für doh.example.com erstellen.
Apache
Wenn Sie Apache verwenden, dann
sudo nano /etc/apache2/sites-available/doh.example.com.conf
Und fügen Sie die folgenden Zeilen in die Datei ein.
<VirtualHost *:80> ServerName doh.example.com DocumentRoot /var/www/dnsdist </VirtualHost>
Speichern und schließen Sie die Datei. Erstellen Sie dann das Web-Root-Verzeichnis.
sudo mkdir /var/www/dnsdist
Legen Sie www-data (Apache-Benutzer) als Eigentümer des Webstammverzeichnisses fest.
sudo chown www-data:www-data /var/www/dnsdist -R
Aktivieren Sie diesen virtuellen Host.
sudo a2ensite doh.example.com
Laden Sie Apache neu, damit die Änderungen wirksam werden.
sudo systemctl reload apache2
Sobald der virtuelle Host erstellt und aktiviert ist, führen Sie den folgenden Befehl aus, um das Let’s Encrypt-Zertifikat mit dem Webroot-Plugin zu erhalten.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist
Nginx
Wenn Sie Nginx verwenden, dann
sudo nano /etc/nginx/conf.d/doh.example.com.conf
Fügen Sie die folgenden Zeilen in die Datei ein.
server { listen 80; server_name doh.example.com; root /var/www/dnsdist/; location ~ /.well-known/acme-challenge { allow all; } }
Speichern und schließen Sie die Datei. Erstellen Sie dann das Web-Root-Verzeichnis.
sudo mkdir -p /var/www/dnsdist
Legen Sie www-data (Nginx-Benutzer) als Eigentümer des Webstamms fest.
sudo chown www-data:www-data /var/www/dnsdist -R
Laden Sie Nginx neu, damit die Änderungen wirksam werden.
sudo systemctl reload nginx
Sobald der virtuelle Host erstellt und aktiviert ist, führen Sie den folgenden Befehl aus, um das Let’s Encrypt-Zertifikat mit dem Webroot-Plugin zu erhalten.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist
Schritt 4:DoH in DNSdist aktivieren
Bearbeiten Sie die DNSdist-Konfigurationsdatei.
sudo nano /etc/dnsdist/dnsdist.conf
Fügen Sie die folgenden Zeilen in die Datei ein.
-- 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"})
Speichern und schließen Sie die Datei. DNSdist wird als _dnsdist
ausgeführt user, also müssen wir den _dnsdist
angeben Benutzerberechtigung zum Lesen des TLS-Zertifikats mit den folgenden Befehlen.
sudo apt install acl sudo setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/
Überprüfen Sie dann die Syntax der Konfigurationsdatei.
sudo dnsdist --check-config
Wenn die Syntax in Ordnung ist, starten Sie DNSdist neu.
sudo systemctl restart dnsdist
Beachten Sie, dass DNSdist nicht neu gestartet werden kann, wenn ein Webserver TCP-Port 443 überwacht. Sie können den Webserver vorübergehend stoppen. Ich werde am Ende dieses Artikels erklären, wie man den Webserver und DNSdist dazu bringt, den TCP-Port 443 gleichzeitig zu verwenden.
Wenn Certbot das TLS-Zertifikat erneuert, müssen Sie die Berechtigung erneut erteilen, aber Sie können den Befehl in der Crontab-Datei hinzufügen.
sudo crontab -e
So:
@daily certbot renew --quiet && setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/
Schritt 5:Konfigurieren Sie DoH im Firefox-Webbrowser
Gehen Sie zu Einstellungen -> Allgemein und scrollen Sie nach unten, um die Netzwerkeinstellungen zu konfigurieren . Aktivieren Sie DNS über HTTPS und richten Sie Ihren eigenen DoH-Resolver ein.
Wir können dann die DoH-Konfigurationen feinabstimmen, indem wir zu about:config
gehen Registerkarte in Firefox.
network.trr.mode
Standardmäßig ist der network.
Parameter in Firefox ist auf 2
gesetzt , was bedeutet, wenn die DoH-Abfrage fehlschlägt, leitet Firefox die DNS-Abfrage an das Hostsystem weiter. Ich möchte immer den DoH-Resolver verwenden, also ändern Sie den network.trr.mode
bis 3
Der Host-Resolver wird also nicht verwendet. Auf diese Weise können wir auf einfache Weise testen, ob Ihr DoH-Resolver funktioniert.
network.trr.allow-rfc1918
Dies wird auf false
gesetzt standardmäßig, d. h. wenn die DNS-Antwort private IP-Adressen enthält, wird sie als falsche Antwort angesehen, die nicht verwendet wird. Wenn Sie die Antwortrichtlinienzone in BIND verwenden, haben Sie wahrscheinlich einige Hostnamen, die auf private IP-Adressen verweisen, dann setzen Sie diesen Wert auf true
.
network. trr. bootstrapAddress
Firefox muss die IP-Adresse des DoH-Resolvers nachschlagen, um DNS-Anfragen zu senden. Sie können die IP-Adresse in dieses Feld eingeben, um diese anfängliche Abfrage zu vermeiden.
Testen
Geben Sie nun einen Domainnamen wie linuxbabe.com
ein in der Firefox-Adressleiste. Wenn die Webseite normal geladen wird, ist dies ein gutes Zeichen dafür, dass Ihr DoH-Resolver funktioniert. Gehen Sie dann zur Terminalkonsole Ihres DNS-Servers und überprüfen Sie die DNS-Abfrageprotokolle. Ich verwende BIND, also gebe ich den folgenden Befehl ein, um das DNS-Abfrageprotokoll zu überprüfen.
Ubuntu 20.04
sudo journalctl -eu named
Ubuntu 18.04
sudo journalctl -eu bind9
Wie Sie dem BIND-Protokoll unten entnehmen können, hat Firefox die folgenden Domänen abgefragt.
- www.linuxbabe.com :meine Website
- fonts.gstatic.com :Dies dient Google Fonts auf meiner Website
- cdn.shareaholic.net :ein Sharing-Widget auf meiner Website
- newsletter.linuxbabe.com :meine selbst gehostete E-Mail-Marketing-Plattform.
- translate.google.com :das Google Übersetzer-Widget auf meiner Website
Das obige Abfrageprotokoll sagt mir, dass mein DNS-über-HTTPS-Resolver funktioniert. Wenn ich den BIND-Resolver stoppe (sudo systemctl stop named
), sagt mir Firefox, dass es diese Seite nicht finden kann. Und wenn ich BIND starte, lädt die Webseite erneut.
Schritt 6:DoH-Client auf Ubuntu Desktop konfigurieren
Ich weiß, dass es unter Linux 3 Open-Source-DNS-Clients gibt, die verschlüsseltes DNS unterstützen.
- systemd-aufgelöst
- stummelig
- dnscrypt-proxy
Derzeit dnscrypt-proxy
ist die beste DoH-Client-Implementierung unter Linux, also werde ich Ihnen zeigen, wie man sie benutzt. Führen Sie den folgenden Befehl aus, um dnscrypt-proxy
zu installieren auf Ihrem Ubuntu-Desktop.
sudo apt install dnscrypt-proxy
Es wird automatisch gestartet, wie Sie sehen können mit:
sudo systemctl status dnscrypt-proxy
Wenn es nicht gestartet wurde, können Sie den folgenden Befehl ausführen, um es zu starten.
sudo systemctl enable dnscrypt-proxy --now
Überprüfen Sie die Abhöradresse.
sudo ss -lnptu | grep dnscrypt-proxy
Auf meinem Computer lauscht dnscrypt-proxy auf 127.0.2.1:53
. Es gibt einen weiteren systemd-Dienst (dnscrypt-proxy-resolvconf.service
) installiert von dnscrypt-proxy,
systemctl status dnscrypt-proxy-resolvconf
Dies ist ein Dienst, der 127.0.2.1
festlegt als Resolver auf Ihrem Computer. Sie können den aktuellen DNS-Resolver für Ihren Computer überprüfen mit:
cat /etc/resolv.conf
Standardmäßig verwendet dnscrypt-proxy Clouldflare als Upstream-DoH-Resolver. Um Ihren eigenen DoH-Resolver zu verwenden, bearbeiten Sie die Konfigurationsdatei.
sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml
Suchen Sie die folgende Zeile
server_names = ['cloudflare']
Ändern Sie ihn in Ihren DoH-Resolver-Hostnamen. Beachten Sie, dass die Position der Parameter wichtig ist. Sie sollten die server_names
nicht angeben Parameter an anderen Stellen in dieser Datei.
server_names = ['doh.example.com']
Kommentieren Sie dann [sources]
aus Abschnitt.
#[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 = ''
Wir müssen unseren eigenen DoH-Resolver wie unten am Ende dieser Datei hinzufügen.
[static] [static.'doh.example.com'] stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'
Der Stempel enthält Ihren DoH-Resolver-Hostnamen, Ihre IP-Adresse und Ihren Abfragepfad. Um Ihren eigenen Stempel zu erhalten, verwenden Sie den Online-DNS-Stempelrechner. Wählen Sie DNS-over-HTTPS als Protokoll und geben Sie die IP-Adresse, den Hostnamen und den Abfragepfad ein. Wenn Sie diesem Tutorial folgen, um Ihren eigenen DoH-Resolver einzurichten, sollte der Pfad nur auf /
gesetzt werden . Wenn Sie DNSSEC auf Ihrem Resolver nicht aktiviert haben, deaktivieren Sie das Kontrollkästchen DNSSEC.
Nachdem Sie Ihren DNS-Stempel hinzugefügt haben, speichern und schließen Sie die Datei. Starten Sie dann dnscrypt-proxy
neu .
sudo systemctl restart dnscrypt-proxy
Überprüfen Sie seinen Status. Stellen Sie sicher, dass es ausgeführt wird.
systemctl status dnscrypt-proxy
Jetzt können Sie testen, ob dnscrypt-proxy funktioniert.
Wenn Sie Ihren DNS-über-HTTPS-Resolver nicht weltweit veröffentlichen möchten, können Sie den DNS-A-Eintrag Ihres DoH-Resolver-Hostnamens löschen, da dnscrypt-proxy die IP-Adresse im DNS-Stempel enthält.
DoH auf iOS konfigurieren
iOS unterstützt DNS über HTTPS seit iOS 14. Es gibt jedoch keine einfache Konfigurationsoption auf iOS, um den DoH-Resolver einzustellen. Sie müssen eine .mobileconfig
generieren Datei und installieren Sie sie auf iOS. Es ist etwas kompliziert, eine signierte iOS .mobileconfig
zu generieren Datei.
Wenn Ihr DoH-Resolver nicht öffentlich verwendet wird, können Sie eine einfache unsignierte Datei generieren. Verwenden Sie einen Texteditor, um eine Datei mit .mobileconfig
zu erstellen Verlängerung. Kopieren Sie den folgenden Text und fügen Sie ihn ein. Ersetzen Sie die IP-Adresse und die Server-URL.
<?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>
Speichern und schließen Sie die Datei. Anschließend können Sie die Datei als E-Mail-Anhang an Ihr iOS senden. Öffnen Sie die E-Mail auf iOS und tippen Sie auf den Anhang, um die Konfigurationsdatei herunterzuladen. Gehen Sie danach zu iOS Settings
-> Profile Downloaded
. Sie werden aufgefordert, das Profil zu installieren.
Tippen Sie auf die Schaltfläche Installieren und geben Sie Ihr iOS-Passwort ein, um es zu installieren. Tippen Sie erneut auf die Schaltfläche Installieren.
Gehen Sie nach der Installation zu iOS Settings
-> VPN & Network
. Scrollen Sie nach unten, um den DNS-Resolver für Ihr iOS-System auszuwählen. Beachten Sie, dass dieser DoH-Resolver den DNS-Resolver überschreibt, der von einem VPN wie ProtonVPN bereitgestellt wird. Ihr iOS verwendet immer Ihren DoH-Resolver.
Wenn Sie jemals die .mobileconfig
entfernen möchten Datei von iOS, gehen Sie zu Settings
-> General
-> Profile
.
Machen Sie DNSdist und Webserver gleichzeitig Port 443 verwenden
Ein DNS-über-HTTPS-Resolver muss sich an Port 443 binden. Wenn Apache/Nginx bereits Port 443 überwacht, kann DNSdist sich nicht an Port 443 binden. Normalerweise kann ein Port nur von einem Prozess verwendet werden. Wir können jedoch HAproxy (High Availability Proxy) und SNI (Server Name Indication) verwenden, damit DNSdist und Apache/Nginx gleichzeitig Port 443 verwenden.
DNSdist-Konfiguration
Bearbeiten Sie die DNSdist-Konfigurationsdatei.
sudo nano /etc/dnsdist/dnsdist.conf
Ändern Sie die DoH-Listening-Adresse 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 })
Speichern und schließen Sie die Datei. Starten Sie dann DNSdist neu.
sudo systemctl restart dnsdist
Nginx-Konfiguration
Wenn Sie Nginx verwenden, bearbeiten Sie die Serverblockdatei.
sudo nano /etc/nginx/conf.d/example.com.conf
Suchen Sie im SSL-Serverblock die folgende Direktive.
listen 443 ssl;
Ändern Sie es in
listen 127.0.0.2:443 ssl;
Dieses Mal lassen wir es auf 127.0.0.2:443
lauschen weil 127.0.0.1:443
wird bereits von DNSdist belegt. Speichern und schließen Sie die Datei. Die Hauptkonfigurationsdatei von Nginx /etc/nginx/nginx.conf
und den Standardserverblock /etc/nginx/sites-enabled/default
könnte einen standardmäßigen virtuellen Host enthalten, der auf 443 lauscht, daher müssen Sie diese Datei möglicherweise auch bearbeiten.
Starten Sie dann Nginx neu.
sudo systemctl restart nginx
Apache-Konfiguration
Wenn Sie den Apache-Webserver verwenden, bearbeiten Sie Ihre virtuelle Hostdatei.
sudo nano /etc/apache2/sites-enabled/example.com.conf
Ändern Sie im virtuellen SSL-Host
<VirtualHost *:443>
An
<VirtualHost 127.0.0.2:443>
Dieses Mal lassen wir es auf 127.0.0.2:443
lauschen weil 127.0.0.1:443
wird bereits von DNSdist belegt. Speichern und schließen Sie die Datei. Bearbeiten Sie dann die /etc/apache2/ports.conf
Datei.
sudo nano /etc/apache2/ports.conf
Ändern
Listen 443
An
Listen 127.0.0.2:443
Speichern und schließen Sie die Datei. Starten Sie Apache neu.
sudo systemctl restart apache2
HAProxy-Konfiguration
Installieren Sie jetzt HAproxy.
sudo apt install haproxy
Starten Sie HAProxy
sudo systemctl start haproxy
Konfigurationsdatei bearbeiten.
sudo nano /etc/haproxy/haproxy.cfg
Wenn Sie Nginx verwenden , kopieren Sie die folgenden Zeilen und fügen Sie sie am Ende der Datei ein. Ersetzen Sie 12.34.56.78
mit der öffentlichen IP-Adresse Ihres Servers. Ersetzen Sie doh.example.com
mit dem von DNSdist verwendeten Domänennamen und www.example.com
mit dem von Ihrem Webserver verwendeten Domainnamen.
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
Wenn Sie Apache verwenden , kopieren Sie die folgenden Zeilen und fügen Sie sie am Ende der Datei ein. Ersetzen Sie 12.34.56.78
mit der öffentlichen IP-Adresse Ihres Servers. Ersetzen Sie doh.example.com
mit dem von DNSdist verwendeten Domänennamen und www.example.com
mit dem von Ihrem Webserver verwendeten Domainnamen.
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
Speichern und schließen Sie die Datei. Starten Sie dann HAproxy neu.
sudo systemctl restart haproxy
In der obigen Konfiguration haben wir die SNI-Funktion (Server Name Indication) in TLS verwendet, um VPN-Verkehr und normalen HTTPS-Verkehr zu unterscheiden.
- Wenn
doh.example.com
ist im TLS-Client Hallo, HAProxy leitet Datenverkehr an das DNSdist-Backend um. - Wenn
www.example.com
befindet sich im TLS-Client. Hallo, HAProxy leitet den Datenverkehr an das Apache/nginx-Backend um. - Wenn der Client den Servernamen nicht in TLS Client Hello angibt, verwendet HAproxy das Standard-Backend (DNSdist).
Sie können dieses Setup mit dem openssl
testen Werkzeug. Führen Sie zuerst den folgenden Befehl mehrmals aus.
echo | openssl s_client -connect your-server-IP:443 | grep subject
Wir haben im obigen Befehl keinen Servernamen angegeben, daher leitet HAproxy die Anfrage immer an das Standard-Backend (DNSdist) weiter und sein Zertifikat wird an den Client gesendet. Führen Sie als Nächstes die folgenden beiden Befehle aus.
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
Jetzt haben wir den Servernamen in den Befehlen angegeben, damit HAproxy Anfragen gemäß den von uns definierten SNI-Regeln weiterleitet.
Wenn Sie das Let’s Encrypt-Zertifikat für Ihre Website erneuern, wird empfohlen, dass Sie den http-01
verwenden Challenge anstelle von tls-alpn-01
herausfordern, da HAproxy auf Port 443 der öffentlichen IP-Adresse lauscht, sodass es den Erneuerungsprozess stören kann.
sudo certbot renew --preferred-challenges http-01