Lokaler DNS Server mit Pi-Hole
Pi-Hole1 ist ein DNS-Forwarder mit eingebauter Filterfunktion. Hauptziel ist es Werbung durch sog. Blackhole-Routing2 zu filtern.
Installation
Die Inbetriebnahme kann sehr schnell mittels Docker
erfolgen (die Installation von Docker erfolgt einfach durch apt install docker docker-compose
):
/opt/docker/pihole/docker-compose.yml:
version: '3'
services:
pihole:
restart: always
image: pihole/pihole:latest
network_mode: host
environment:
- TZ=Europe/Berlin
- WEBPASSWORD=<YOURSECRETPASSWORD>
- VIRTUAL_HOSTAA=pi.hole
volumes:
- /docker/pi-hole/etc/pihole:/etc/pihole
- /docker/pi-hole/dnsmasq.d/pihole:/etc/dnsmasq.d
- /docker/pi-hole/etc/lighttpd:/etc/lighttpd
cap_add:
- NET_ADMIN
- SYS_NICE
Konfiguration
Die Weboberfläche von Pi-Hole ist erreichbar unter: http://<SERVERIP>:8000/admin/
Adlists
Pi-Hole liefert bereits eine Liste mit zu blockierenden Domains mit. Diese kann und sollte jedoch erweitert werden. Ich nutze derzeit folgende Listen:
- https://adaway.org/hosts.txt
- https://dbl.oisd.nl/basic/
- https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt
- https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt
- https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt
- https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.2o7Net/hosts
- https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/AmazonFireTV.txt
- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
- https://v.firebog.net/hosts/AdguardDNS.txt
- https://v.firebog.net/hosts/Admiral.txt
- https://v.firebog.net/hosts/Easylist.txt
- https://v.firebog.net/hosts/Easyprivacy.txt
- https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt
- https://www.github.developerdan.com/hosts/lists/amp-hosts-extended.txt
- https://www.github.developerdan.com/hosts/lists/dating-services-extended.txt
- https://www.github.developerdan.com/hosts/lists/facebook-extended.txt
- https://www.github.developerdan.com/hosts/lists/tracking-aggressive-extended.txt
Settings / DNS
Pi-Hole löst DNS-Abfragen nicht selbst auf, sondern nutzt dazu Upstream-DNS-Server. Es werden diverse Anbieter unterstützt. Ich nutze folgende Einstellungen:
- IPv4:
- Quad9 (filtered, DNSSEC)
- 9.9.9.9
- 149.112.112.112
- Quad9 (filtered, DNSSEC)
- IPv6:
- Quad9 (filtered, DNSSEC)
- 2620:fe::fe
- 2620:fe::9
- Quad9 (filtered, DNSSEC)
- Custom DNS 1 (IPv4)
- 116.202.176.26
Wer stark auf Content-Delivery-Networks (CDNs) angewiesen ist und weniger Wert auf Privatsphäre legt, kann auch die ECS (Extended-Client-Subnet) Varianten von Quad 9 nutzen. Hierbei werden Teile der eigenen IP-Adresse übermittelt, damit das CDN den geografisch schnellsten Server zurück liefern kann.
Settings / DNS / Advanced DNS settings
Hier nutze ich folgende Einstellungen:
- (x) Never forward non-FQDN A and AAAA queries
- (x) Never forward reverse lookups for private IP ranges
- (x) Use DNSSEC
Settings / DHCP
Ich nutze Pi-Hole auch als DHCP3, denn die Adminoberfläche lädt schneller als die meines Routers. Ich nutze hier, neben den obligatorischen Angaben zur IP-Range und Gateway, folgende Einstellungen:
- (x) Enable DHCPv4 rapid commit (fast address assignment)
- (x) Enable IPv6 support (SLAAC + RA)
Settings / Privacy
Da ich keine Statistiken, etc. benötige schalte ich die hierfür nötige Datenspeicherung ab:
- (x) Anonymous mode: This disables basically everything except the live anonymous statistics
Router Einstellungen
An meinem Router muss ich nun natürlich DHCP abschalten. Damit alle meine Geräte die Pi-Hole-Instanz als DNS-Server nutzen, muss ich dessen IP-Adresse als DNS-Server (für IPv4 und IPv6) hinterlegen. Alternativ kann ich dies natürlich auch an meinen Geräten selbst einstellen, muss dies dann aber eben auch an jedem Gerät tun, statt einmalig, zentral am Router.
Update
Um Pi-Hole aktuell zu halten, wird jede Nacht mittels cronjob
folgendes Script ausgeführt:
cd /opt/docker/pihole
/usr/bin/docker-compose exec pihole pihole -g
/usr/bin/docker-compose pull
/usr/bin/docker-compose up -d