Sätt upp DNS-over-HTTPS (DoH) på en egen server

Inledning

I den här guiden visar vi dig hur du själv kan sätta upp en DoH-server och börja skicka krypterade DNS-anrop på mindre än en halvtimme med hjälp av GleSYS Cloud.

Vi kommer använda oss av en CentOS-server med nginx, DoH-proxy och Unbound, samt Let’s Encrypt och ett domännamn som du själv behöver bidra med.

Så här gör du

Börja med att logga in i vår kontrollpanel och starta upp en server med Centos 7. När du valt en IP-adress för din server, går du till DNS-inställningarna i GleSYS Cloud och pekar doh.example.com (du behöver byta ut example.com mot din domän) mot den IPv4 och IPv6 du tilldelat din server.

Logga in på din server över ssh och skriv:

yum update

När det är klart är det dags att börja installationen.

Vi börjar med att installera git, bind-utils, och certbot-nginx:

yum -y install git bind-utils certbot-nginx

Då vi behöver köra minst python 3.5 installerar vi python3.6 från https://ius.io, genom att skriva:

yum -y install https://centos7.iuscommunity.org/ius-release.rpm 
yum -y install python36u python36u-pip python36u-devel

Nu är det dags att installera doh-proxy. Det gör vi enklast genom att skriva följande:

pip3.6 install doh-proxy

Nästa steg är att lägga till en användare som kan köra doh-proxy utan root-rättigheter, samt att att justera rättigheterna.

adduser -r doh-proxy -d /var/lib/proxy -c ‘Homer says DOH!’ -s /sbin/nologin -U
mkdir /var/lib/doh-proxy && chown doh-proxy: /var/lib/doh-proxy && chown 700 /var/lib/doh-proxy

Nu behöver vi konfigurera servern så att DoH-proxy kommer igång efter en omstart. Det är enklast om du bara kopierar in följande rader:

cat <<EOF > /etc/systemd/system/doh-httpproxy\@.service
[Unit]
Description=DOH HTTP Proxy on %I
After=syslog.target network.target
Before=nginx.target

[Service]
Type=simple
ExecStart=/bin/doh-httpproxy --upstream-resolver 79.99.4.100 --level DEBUG --listen-address=::1 --port %I
Restart=always
User=doh-proxy
Group=doh-proxy

[Install]
WantedBy=multi-user.target
EOF

Därefter behöver du ladda om konfigurationen genom att köra:

systemctl daemon-reload

Nästa steg blir att konfigurera systemd så att den drar upp två instanser av doh-httpproxy på port 8080 och port 8081:

for i in 8080 8081
do
    cp /etc/systemd/system/doh-httpproxy\@.service \
        /etc/systemd/system/doh-httpproxy\@${i}.service
    systemctl enable doh-httpproxy@${i}
    systemctl start doh-httpproxy@${i}
done

För att servern ska kunna svara på requests behöver den dock en rekursiv namnserver. I den här guiden har vi valt att använda oss av Unbound. Så, vi installerar det:

yum -y install unbound
systemctl enable unbound
systemctl start unbound

Klart! Nu är det dags att installera och konfigurera nginx så vi har en fungerande HTTPS-lösning där vi kan svara på anrop:

yum -y install nginx
systemctl enable nginx
systemctl start nginx 

För enkelhets skull använder vi oss av Let's Encrypt och deras certbot som vi installerade tidigare i guiden. Först måste vi dock öppna i brandväggen för http och https.

Skriv följande:

firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

För att kontrollera att allting fungerar kan du nu besöka doh.example.com (kom ihåg att byta ut “example.com” mot din domän som du pekade mot serverns IP-adress tidigare i guiden. Om du når nginx default-webbsida fungerar allt som det ska! Om inte bör du nu gå tillbaka i guiden och kontrollera att du gjort alla steg.

För att skapa ett certifikat skriver du följande. Kom ihåg att byta ut doh.example.com mot din domän.

certbot --nginx -d doh.example.com

Kontrollera nu att https://doh.example.com fungerar. Om du når nginx default-sida över https har du lyckats med installationen av certifikatet.

Nu är det dags att konfigurera http2 och nginx med doh-proxy. Öppna /etc/nginx/nginx.conf och leta upp raderna nedan:

  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot

Lägg till http2 efter ssl ovan på samma rader. Det ska se ut så här när du är klar:

   listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
   listen 443 ssl http2; # managed by Certbot

Leta sedan upp raden där det står:

    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

Precis under den lägger du till följande rader för att se till att vi bara accepterar HEAD, GET och POST-requests.

    if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
        return 501;
    }

Nästa steg är att konfigurera den backend som ska lyssna på https://doh.example.com/dns-query.

Leta upp raden där det står:

location / {

}

Tänk på att det ska vara den rad som finns i server-blocket för HTTPS, och inte den första som finns i blocket för HTTP.

Om du söker så är det sjunde instanser av strängen location i en nginx standarkonfiguration (med ovan ändringar).

Byt ut raderna mot följande kod:

       location /dns-query {
              proxy_set_header Host $http_host;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_redirect off;
              proxy_buffering off;
              proxy_pass http://dohproxy_backend;
        }

Leta nu upp raderna där det står följande. I din config kommer du se ditt domännamn istället, så kom ihåg att leta efter det och inte det som står nedan.

server {
   server_name doh.example.com; # managed by Certbot

När du hittat raderna ovan lägger du in följande kod ovanför:

upstream dohproxy_backend {
        server [::1]:8080;
        server [::1]:8081;
}

Då CentOS använder sig av SELinux behöver vi skriva följande:

setsebool -P httpd_can_network_connect=true

Nu kan du starta om nginx med:

systemctl restart nginx

Du bör nu ha en fungerande lösning med nginx, doh-proxy, unbound och certbot.

För att testa den kan du antingen använda dig av Firefox-inställningarna i det här blogginlägget, eller genom att använda doh-stub på följande vis:

doh-stub --listen-port 5353 --domain doh.example.com --remote-address ::1

Fungerade det inte? Bytte du ut doh.example.com mot din domän?

Öppna nu en ny terminal och logga in på samma server, och skriv:

dig @::1 -p 5353 glesys.se

Du bör nu ha fått ett svar med ett A-record.

Om du vill kan du köra doh-stub på din workstation och skicka all trafik via DoH.

Det gör du genom att dra igång klienten i ditt *nix-system. Först behöver du klona ner https://github.com/facebookexperimental/doh-proxy och bygga det enligt instruktionerna på sidan. Sen skriver du:

sudo doh-stub --domain doh.example.com --remote-address <serverns IP> --listen-address ::1 &

Sen uppdaterar du /etc/resolv.conf och skriver in följande:

nameserver ::1

Grattis! Du har nu konfigurerat din första DoH-server.

Läs gärna vårt blogginlägg om grunderna i DNS over HTTPS.

Hittar du inte det du söker?

Kontakta oss gärna för mer information. Vi hjälper dig att komma fram till den bästa lösningen för dina behov.

Skicka e-post Ring 0200-23 88 00