GuiderNätverk och VPNAnnonsfilter med AdGuard

Blockera annonser på alla enheter med AdGuard Home och Podman utan root

AdGuard Home på Debian 13 i rootless Podman bakom Caddy, som blockerar annonser och spårare för dina mobiler och datorer via DNS-over-TLS och DNS-over-HTTPS, med vanlig DNS bara för din VPN och aldrig öppen mot internet.

Testad på AdGuard Home 0.107.79 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 27 september 2026

Rekommenderad server för guiden

VC-S Micro · 2 vCPU · 8 GB Minne · 250 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

90 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

AdGuard Home är en DNS-server som blockerar annonser och spårare. En enhet som frågar efter ett namn som doubleclick.net får 0.0.0.0 tillbaka, så annonsen laddas aldrig, i alla appar och webbläsare, utan att du installerar något på enheten. I ett webbgränssnitt ser du vad varje enhet slår upp och väljer vilka blocklistor som gäller.

Här körs den i Podman under en egen användare som heter adguard, bakom Caddy från Podman-guiden. Vill du ha en privat resolver utan annonsblockering är Unbound det enklare valet.

Upplägget spelar större roll än vanligt, eftersom en DNS-server på internet är ett mål:

  • Vanlig DNS svarar bara din VPN. Vanlig DNS går över UDP, där avsändaradressen kan förfalskas. En resolver som svarar vem som helst används inom några timmar för att översvämma andra nätverk: angriparen skickar små frågor med offrets adress som avsändare, och din server skickar de mycket större svaren till offret. Därför lyssnar port 53 bara på adressen till din WireGuard-VPN, aldrig på serverns publika adresser.
  • Krypterad DNS svarar alla. DNS-over-TLS och DNS-over-HTTPS går över TCP med TLS, och en förfalskad avsändare kan inte slutföra anslutningen, så de går inte att använda för sådana attacker. Det är dem mobilerna använder: Androids Private DNS talar DNS-over-TLS, och en iPhone tar emot en profil med DNS-over-HTTPS. Båda kräver ett riktigt certifikat, som Caddy hämtar från Let's Encrypt.
  • Webbgränssnittet svarar bara din VPN. AdGuard Home har en egen inloggning, men bakom en proxy räknar den alla besökare som en: fem felaktiga lösenord från en främling skulle låsa ute dig i 15 minuter. Caddy håller gränssnittet för enheter på VPN:en och släpper igenom DNS-over-HTTPS för alla.

Varje steg nedan har körts på en ny Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:

  • AdGuard Home 0.107.79 svarade på DNS-over-TLS och DNS-over-HTTPS från internet med ett giltigt certifikat från Let's Encrypt, och gav 0.0.0.0 för doubleclick.net. DNS-over-TLS och DNS-over-HTTPS över IPv6 testades från själva servern.
  • En WireGuard-enhet använde vanlig DNS på VPN-adressen. Från internet svarade port 53 inte alls, både med ufw påslagen och med ufw avstängd en kort stund, och en kontroll från check-host.net i flera länder fick timeout.
  • Frågeloggen visade varje enhets riktiga adress, för vanlig DNS, DNS-over-TLS och DNS-over-HTTPS.
  • När certifikatfilen ändrades läste AdGuard Home in den av sig själv, utan omstart.
  • En säkerhetskopia återställdes, och allt startade igen av sig självt efter en omstart av servern.

AdGuard Home använde omkring 60 MB minne, med standardlistan på omkring 183 000 regler.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång;
  • WireGuard uppsatt som i WireGuard-guiden, med tunneladressen 10.8.0.1 och enheter som skickar all sin trafik genom den;
  • ufw som i säkerhetsguiden, steg 1 till 4;
  • en A-post och en AAAA-post för adguard.example.com som pekar på din server;
  • dig på din egen dator, för att testa: på Debian och Ubuntu finns det i bind9-dnsutils.

Exemplen använder adguard.example.com för AdGuard Home, 203.0.113.10 för serverns IPv4-adress och 2001:db8:1f::/64 för dess IPv6-nät. Byt ut dem genomgående.

Om du kör Unbound på 10.8.0.1 har den redan port 53 där. Stäng av den först med systemctl disable --now unbound, eller välj den ena eller den andra.

1. Låt appar använda port 53

Som root låter du vanliga användare använda portar från 53 och uppåt, och binda till VPN-adressen redan innan WireGuard har skapat den vid uppstart:

cat > /etc/sysctl.d/50-unprivileged-ports.conf <<EOF
net.ipv4.ip_unprivileged_port_start = 53
net.ipv4.ip_nonlocal_bind = 1
EOF
sysctl --system

Filen ersätter den från Podman-guiden, och 53 täcker även portarna 80, 443 och 853. Alternativet, att låta Caddy ta emot DNS också, skulle kräva en Caddy med extra moduler: så här sköter AdGuard Home sina egna portar.

2. Skapa användaren

useradd -m -s /bin/bash adguard
loginctl enable-linger adguard
machinectl shell adguard@

Som adguard skapar du katalogerna för inställningar, data och certifikat:

mkdir -p ~/.config/containers/systemd ~/conf ~/work ~/certs
chmod 700 ~/conf ~/work

Allt fram till steg 4 körs som adguard.

3. Definiera containern

Skapa ~/.config/containers/systemd/adguard.container:

[Unit]
Description=AdGuard Home

[Container]
ContainerName=adguard
Image=docker.io/adguard/adguardhome:latest
Volume=%h/conf:/opt/adguardhome/conf
Volume=%h/work:/opt/adguardhome/work
Volume=%h/certs:/opt/adguardhome/certs:ro
# The web interface and DNS-over-HTTPS, for Caddy only
PublishPort=127.0.0.1:3000:3000
# Plain DNS, on the VPN address only
PublishPort=10.8.0.1:53:53/udp
PublishPort=10.8.0.1:53:53/tcp
# DNS-over-TLS, for everyone
PublishPort=853:853/tcp
AutoUpdate=registry

[Service]
Restart=always

[Install]
WantedBy=default.target

Starta den och slå på Podmans dagliga uppdateringar:

systemctl --user daemon-reload
systemctl --user start adguard
systemctl --user enable --now podman-auto-update.timer

Bara portarna i filen går att nå. Port 53 publiceras enbart på 10.8.0.1, så även med brandväggen avstängd svarar ingenting på DNS på dina publika adresser.

4. Gör installationen

Tills installationen är klar har AdGuard Home inget lösenord, och den som öppnar den först väljer ett. Därför ligger porten bara på 127.0.0.1, och därför når du den via SSH så länge. Från din egen dator:

ssh -L 3000:127.0.0.1:3000 root@203.0.113.10

Låt sessionen vara öppen och öppna http://localhost:3000 i webbläsaren. Välj Get Started, och sedan:

  • Under Admin Web Interface ändrar du Port till 3000, porten i containerfilen. Låt Listen interface stå på All interfaces och DNS server på port 53. Adresserna som listas under fälten är vad AdGuard Home ser inne i sin container; bara portarna från steg 3 går att nå på riktigt.
  • Välj Next. Under Authentication anger du Username, Password och Confirm password, och väljer Next.
  • Välj Next en gång till. "Congratulations!" betyder att installationen är klar.

Nu frågar AdGuard Home efter inloggningen vid varje besök. Du kan stänga SSH-sessionen.

5. Sätt Caddy framför

Som root byter du till machinectl shell caddy@ och lägger till det här blocket sist i ~/Caddyfile:

adguard.example.com {
    # DNS-over-HTTPS and the Apple profiles are for everyone, the web interface only for the VPN
    @admin {
        not path /dns-query /dns-query/* /apple/*
        not remote_ip 10.8.0.0/24 2001:db8:1f::/64
    }
    respond @admin 403
    reverse_proxy 127.0.0.1:3000
}

Starta om Caddy med systemctl --user restart caddy. Den hämtar ett certifikat för adguard.example.com inom några sekunder.

remote_ip listar VPN:ens IPv4-nät och serverns /64, som WireGuard ger varje enhet dess IPv6-adress från. En enhet på VPN:en når gränssnittet på https://adguard.example.com; alla andra får "403".

6. Ge AdGuard Home certifikatet

DNS-over-TLS på port 853 går inte via Caddy, så AdGuard Home behöver själva certifikatet. Caddy har det i sin egen volym, som bara användaren caddy kan läsa. Som root skapar du en tjänst som kopierar det, /etc/systemd/system/adguard-cert.service:

[Unit]
Description=Copy the certificate for adguard.example.com from Caddy to AdGuard Home

[Service]
Type=oneshot
Environment=D=/home/caddy/.local/share/containers/storage/volumes/caddy-data/_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/adguard.example.com
ExecStart=install -C -o adguard -g adguard -m 600 ${D}/adguard.example.com.crt /home/adguard/certs/cert.pem
ExecStart=install -C -o adguard -g adguard -m 600 ${D}/adguard.example.com.key /home/adguard/certs/key.pem

Och en timer som kör den varje dag, /etc/systemd/system/adguard-cert.timer:

[Unit]
Description=Copy the certificate for AdGuard Home every day

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Slå på timern och kopiera certifikatet direkt:

systemctl daemon-reload
systemctl enable --now adguard-cert.timer
systemctl start adguard-cert.service
ls -l /home/adguard/certs

ls ska lista cert.pem och key.pem, som ägs av adguard. Caddy förnyar certifikatet ungefär en månad innan det går ut, och install -C kopierar bara en fil som har ändrats. AdGuard Home håller koll på filerna och läser in ett nytt certifikat av sig självt: loggen visar certificate file is modified.

7. Slå på krypterad DNS

Som adguard igen stoppar du AdGuard Home medan du ändrar inställningarna:

systemctl --user stop adguard
nano ~/conf/AdGuardHome.yaml

Ändra de här raderna till värdena nedan, var och en i sin del av filen, och låt resten vara som det är:

http:
  doh:
    insecure_enabled: true
dns:
  ratelimit: 0
  trusted_proxies:
    - 127.0.0.0/8
    - ::1/128
    - 203.0.113.10/32
tls:
  enabled: true
  server_name: adguard.example.com
  port_https: 0
  port_dns_over_tls: 853
  port_dns_over_quic: 0
  certificate_path: /opt/adguardhome/certs/cert.pem
  private_key_path: /opt/adguardhome/certs/key.pem
querylog:
  interval: 24h
clients:
  runtime_sources:
    whois: false
    rdns: false

Starta den sedan igen:

systemctl --user start adguard

Vad ändringarna gör:

  • insecure_enabled låter AdGuard Home svara på DNS-over-HTTPS utan egen TLS, eftersom Caddy sköter den. port_https: 0 hindrar den från att öppna en HTTPS-port som Caddy redan har, och port_dns_over_quic: 0 låter DNS-over-QUIC vara avstängd.
  • trusted_proxies med serverns IPv4-adress gör att AdGuard Home litar på besökarens adress som Caddy skickar vidare. Caddys egna anslutningar når containern från den adressen, som Podman-guiden förklarar, så utan raden skulle varje enhet med DNS-over-HTTPS visas som servern.
  • ratelimit: 0 stänger av gränsen på 20 uppslagningar i sekunden. Den gäller bara vanlig DNS, som bara dina egna enheter når, och den räknar hela VPN:en som en enda enhet. I testet räckte det med en enhet som slog upp 40 namn på en gång för att gå över den, och en del uppslagningar fick timeout.
  • querylog sparar loggen över varje uppslagning i 24 timmar i stället för 90 dagar. Query logs rotation, under Settings och General settings, ändrar det senare, bredvid Statistics retention för siffrorna på översikten, som är 24 timmar från början.
  • whois: false och rdns: false hindrar AdGuard Home från att slå upp ägaren och namnet för varje publik adress som använder den, hos publika WHOIS-servrar och via Quad9.

Till sist, som root, öppnar du DNS-over-TLS i brandväggen och låter VPN-enheterna nå DNS-servern:

ufw allow 853/tcp
ufw allow in on wg0

Port 443, för DNS-over-HTTPS, är redan öppen för Caddy.

8. Kontrollera utifrån

Från din egen dator, inte på VPN:en. DNS-over-TLS:

dig +tls +tls-ca @adguard.example.com doubleclick.net

DNS-over-HTTPS:

dig +https +tls-ca @adguard.example.com doubleclick.net

Båda ska svara 0.0.0.0: annonsdomänen är blockerad. +tls-ca kontrollerar certifikatet, så ett svar betyder också att det är giltigt. Ett namn som inte är blockerat, som example.com, får sina riktiga adresser.

Vanlig DNS, på serverns publika adress:

dig @203.0.113.10 example.com

Den här får inte svara: dig ska visa "timed out". För att kontrollera från flera platser på en gång ska https://check-host.net/check-tcp?host=203.0.113.10:53 visa "Connection timed out" från varje nod, medan samma kontroll för port 853 får kontakt.

På en enhet som är ansluten till VPN:en ska dig @10.8.0.1 doubleclick.net också svara 0.0.0.0.

9. Peka dina enheter mot den

  • Enheter på VPN:en. I varje enhets WireGuard-konfiguration, från steg 7 i WireGuard-guiden, sätter du DNS = 10.8.0.1 och läser in konfigurationen på enheten igen.
  • Android, på alla nätverk: öppna Settings, Network & internet, Private DNS, välj Private DNS provider hostname och ange adguard.example.com. Namnen på inställningarna skiljer sig lite mellan tillverkare, och på en telefon på svenska heter de något annat.
  • iPhone och Mac, på alla nätverk: öppna https://adguard.example.com/apple/doh.mobileconfig?host=adguard.example.com&client_id=anna-phone i Safari och installera profilen under Settings, General, VPN & Device Management.
  • Webbläsare, som Firefox eller Chrome: ange en egen DNS-over-HTTPS-leverantör, https://adguard.example.com/dns-query/anna-laptop.

Den sista delen av adressen, anna-phone eller anna-laptop, är ett namn du väljer för varje enhet, och frågeloggen visar det i stället för enhetens adress. Android kan inte skicka något namn här, eftersom det skulle kräva ett eget certifikat för varje enhetsnamn, så den visas med sin adress.

Profilen för iPhone och stegen för mobiler har inte testats på riktiga telefoner i den här guiden. DNS-over-TLS och DNS-over-HTTPS testades med dig som i steg 8, och profilen laddades ner och kontrollerades.

10. Blocklistor, integritet och uppdateringar

I webbgränssnittet listar Filters och DNS blocklists blocklistorna. AdGuard DNS filter är påslagen från början, med omkring 183 000 regler. Add blocklist lägger till fler, och Check for updates hämtar dem direkt. AdGuard Home hämtar varje lista igen en gång om dygnet, vilket Filter update interval under Settings och General settings ändrar. För att släppa igenom en blockerad webbplats lägger du till en regel som @@||example.com^ under Filters och Custom filtering rules.

Ett blockerat namn får 0.0.0.0, eller :: för IPv6. Blocking mode, under Settings och DNS settings, kan svara NXDOMAIN eller REFUSED i stället.

Vad AdGuard Home skickar ut, och vad den inte skickar:

  • Det finns ingen telemetri. Containeravbilden stänger också av AdGuard Homes egen kontroll av uppdateringar, så den kontaktar aldrig AdGuard för att leta efter nya versioner.
  • Den skickar dina uppslagningar till Quad9 via DNS-over-HTTPS, https://dns10.quad9.net/dns-query, vilket Upstream DNS servers under DNS settings ändrar. Quad9 ser namnen, som kommer från serverns adress och inte från dina enheter.
  • Den hämtar blocklistorna från deras adresser, på GitHub för de förvalda.
  • Use AdGuard browsing security web service och Use AdGuard parental control web service är avstängda. Slår du på dem skickar AdGuard Home början av en hash av varje namn till AdGuard.

Själva AdGuard Home uppdateras av Podman, från steg 3: en gång om dygnet letar den efter en ny avbild och startar om containern på den. För att se vad den skulle uppdatera just nu, som adguard:

podman auto-update --dry-run

11. Säkerhetskopiera

Som adguard:

mkdir -p ~/backup
systemctl --user stop adguard
tar -czf ~/backup/adguard.tar.gz -C ~ conf work
systemctl --user start adguard

conf innehåller alla inställningar, med hashen av ditt lösenord, och work frågeloggen, statistiken och de nedladdade blocklistorna; filen blev omkring 1,5 MB här. Kopiera ~/backup till en annan maskin och förvara den säkert. För att återställa stoppar du AdGuard Home, tar bort ~/conf och ~/work, packar upp filen med tar -xzf ~/backup/adguard.tar.gz -C ~ och startar den igen. Certifikatet finns inte i säkerhetskopian: steg 6 kopierar det igen.

Vanlig DNS för en hemmarouter i stället

En hemmarouter kan oftast inte använda DNS-over-TLS, och kanske inte köra WireGuard. Har ditt hem en fast IPv4-adress kan du i stället öppna vanlig DNS för just den adressen. Kontrollera först att ufw är påslagen med ufw status: det här hänger på den.

I adguard.container, som adguard, ändrar du de två raderna för vanlig DNS till alla adresser:

PublishPort=53:53/udp
PublishPort=53:53/tcp

Starta om med systemctl --user daemon-reload och systemctl --user restart adguard. Som root släpper du sedan in ditt hems adress, här 198.51.100.20, och ingen annan:

ufw allow from 198.51.100.20 to any port 53

Ange 203.0.113.10 som DNS-server i routern. Kontrollera igen utifrån som i steg 8: check-tcp för port 53 ska fortfarande få timeout från varje nod. Om ditt hems adress ändras tar du bort regeln med ufw delete allow from 198.51.100.20 to any port 53 och lägger till den nya. Öppna aldrig port 53 för alla.

Felsökning

AdGuard Home startar inte, och loggen visar "Failed to bind port 53 (Permission denied)". Steg 1 saknas eller har inte lästs in; sysctl net.ipv4.ip_unprivileged_port_start ska visa 53. Kör sedan systemctl --user reset-failed adguard och starta den igen.

Webbgränssnittet visar "403". Enheten är inte på VPN:en, eller skickar inte all sin trafik genom den. Anslut WireGuard med AllowedIPs = 0.0.0.0/0, ::/0, som i WireGuard-guiden.

Inloggningen svarar "auth: blocked for" och en tid. Fem felaktiga lösenord spärrar inloggningen i 15 minuter. Vänta, eller starta om AdGuard Home med systemctl --user restart adguard, vilket häver spärren.

DNS-over-TLS får timeout från mobilen, medan DNS-over-HTTPS fungerar. Port 853 är inte öppen: ufw allow 853/tcp från steg 7.

Enheter på VPN:en tappar DNS. ufw allow in on wg0 från steg 7 saknas. Kontrollera också att ss -lnup | grep :53 listar 10.8.0.1:53.

Loggen visar "certificates has no IP addresses; DNS-over-TLS won't be advertised via DDR". Det är ofarligt. Enheter som är inställda som i steg 9 använder namnet, inte en adress.

En webbplats du behöver slutar fungera. Öppna Query Log, leta upp det blockerade namnet från den enheten, öppna menyn i slutet av raden och välj Unblock. Eller lägg till en @@||-regel som i steg 10.

Kör det på din egen server

VC-S Micro

90 kr/mån

vCPU
2
Minne
8 GB
Lagring
250 GB
Trafik
10 TB
Standard
HDD · RAID 10
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider