Kategorien
Linux Netzwerk(e) Wissen

„Quickie“ – lokale DNS-Zonen mit pi-Hole

In einem Netzwerk kommen manchmal mehr DNS-Zonen zusammen, als einem lieb ist. Neben dem obligatorischen .box bringen häufig auch andere Router / AccessPoints, Domaincontroller, DLAN-Adapter usw. usf. eigene DHCP-Server mit.

Wer hier – wie ich – mit unterschiedlichen DNS-Zonen arbeitet, möchte natürlich dennoch einen zentralen Anlaufpunkt haben, der einem alle Anfragen beantwortet.

Jetzt könnte man natürlich beginnen, eine entsprechende „Kette“ zusammenzulöten. Der Internetrouter fragt den Provider, der Domaincontroller fragt den Internetrouter, die AccessPoints fragen den DC usw. usf.

Das funktioniert und ist eine todsichere Methode, sich diverse „Single point of failure“ ins Netz zu stellen. Spätestens bei der Fehlersuche hat man weder Zeit, noch Muße, diese Kette wieder von hinten aufzudröseln.

Ich betreibe dafür in meinem Netwerk einen pi-Hole DNS Server. Dieser ist so konfiguriert, dass er alle Anfragen an die DNS-Server von Quad9 weiterleitet.

Das funktioniert solange gut, wie man nicht versucht, einen Hostnamen wie z.B. http://fritz.box/ via Browser aufzurufen 🙂

Die Kür besteht also darin, dem pi-Hole mitzuteilen, welche Zone er wo aufgelöst bekommt. Und weil es so schön ist, machen wir das nicht nur für die Vorwärts-, sondern auch für die Rückwärtsauflösung.

So, lange genug geschwafelt. Hier der versprochene „Quickie“:

In meinem imaginären Beispielnetz gibt es drei DNS-Zonen:

  • .box (192.168.178.0/24) – das Netz von der FRITZ!Box. DNS-Server hierfür ist 192.168.178.1
  • .lan.altmetaller (192.168.11.0/24) – meine PCs. DNS-Server für diese Zone ist 192.168.11.1
  • .dmz.altmetaller (192.168.22.0/24) – meine DMZ. DNS-Server für diese Zone ist 192.168.22.1

Im Verzeichnis /etc/dnsmasq.d/ lege ich für jede Zone eine entsprechende Datei an.

/etc/dnsmasq.d/10-box.conf

server=/box/192.168.178.1
server=/178.168.192.in-addr.arpa/192.168.178.1
local=/box/

/etc/dnsmasq.d/10-lan.altmetaller.conf

server=/lan.altmetaller/192.168.11.1
server=/11.168.192.in-addr.arpa/192.168.11.1
local=/lan.altmetaller/

/etc/dnsmasq.d/10-dmz.altmetaller.conf

server=/dmz.altmetaller/192.168.22.1
server=/22.168.192.in-addr.arpa/192.168.22.1
local=/dmz.altmetaller/

Der Neustart des Deamon erfolgt übrigens mit

sudo pihole restartdns

Noch etwas zur Sicherheit: In dem vorgenannten Beispiel habe ich die Rebind-Protection für die jeweiligen Netze abgeschaltet.

Das mag jetzt der Eine oder Andere als Sicherheitsloch sehen. Ein Rebind-Angriff ist tatsächlich denkbar, allerdings müsste der Angreifer dafür Kontrolle über die DNS-Server in meinem lokalen Netz erlangen. Oder halt dem Client (oder den Pi-Hole) dazu veranlassen, einen anderen DNS zu fragen.

Und, mal ernsthaft: In dem Fall wäre ein DNS-Rebind noch das kleinste Übel…

Kategorien
Linux Netzwerk(e) Wissen

„Quickie“ – Ubuntu Linux als Router einrichten

Einleitung

Im Ubuntu-Wiki findet man eine Anleitung, wie man einen Linux-PC als Router verwendet. Diese enthält ein paar Fallstricke.

Da man bei der Fehlersuche auf diverse „Wahnsinnsvorschläge“ (resolved deinstallieren, Upstream-DNS in resolv.conf eintragen, DNSStubListener deaktivieren usw.) stößt, erklärt diese auf das Wesentliche reduzierte Anleitung die „Best practice“.

In meinem Beispiel hat der Linux-PC zwei Schnittstellen:

  • eth0: Internetanbindung
  • eth1: Hier hängen die Geräte, die den Rechner als Router nutzen sollen

Zur Vorbereitung bekommt eth1 eine statische IP-Adresse zugewiesen. In meinem Beispiel habe ich, dem Ubuntu-Wiki entsprechend, die 192.168.3.1/24 gewählt.

Konfiguration Server

Zuerst installiert man dnsmasq:

sudo apt-get install dnsmasq

In der Datei /etc/dnsmasqd.conf werden folgende Einstellungen vorgenommen:

# DHCP-Server aktiv für Interface
interface=eth1
# DHCP-Server nicht aktiv für Interface
no-dhcp-interface=eth0
# Als DHCP-Range verwenden wir 192.168.3.2 bis 192.168.3.254
dhcp-range=192.168.3.2,192.168.3.254,12h

Ganz wichtig: Mit dieser Konfiguration kann der dnsmasq noch nicht starten, da er versucht, sich an Port 53 vom localhost zu klemmen. Dort residiert aber schon der resolved und der Port kann nur einmal belegt werden. „Best practice“ ist hier, folgende zusätzliche Option in der /etc/dnsmasqd.conf zu setzen:

bind-interfaces

Damit wird erreicht, dass der Service nur an Schnittstellen gebunden wird, die wir explizit angegeben haben. In unserem Beispiel also nur an eth1.

Zum Testen starten wir den dnsmasq manuell:

sudo systemctl start dnsmasq

Ob er läuft bzw. warum er nicht startet, verrät uns folgender Befehl:

sudo systemctl status dnsmasq -l

Wenn das funktioniert, möchten wir, dass dnsmasq bei jedem Systemstart automatisch geladen wird:

sudo systemctl enable dnsmasq

Ganz wichtig: Hier lautet der zweite Fallstrick, da die benötigten Schnittstellen beim Systemstart u.U. noch nicht aktiv sind. Wir holen uns die Startdatei wie folgt in den Editor:

sudo systemctl edit --full dnsmasq.service

Hier finden wir den Abschnitt [Unit], dort ergänzen wir folgende Beiträge:

After=network-online.target
Wants=network-online.target

Nach dem Speichern können wir das Ergebnis dieser Änderung in /etc/systemd/system/dnsmasq.service überprüfen.

Portweiterleitung

IP-Forwarding aktivieren:

sudo sysctl -w net.ipv4.ip_forward=1

Das Forwarding funktioniert nur bis zum nächsten Neustart. Möchte man es dauerhaft etablieren, entfernt man die Auskommentierung in der /etc/sysctl.conf

sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Wir benötigen Regeln für die iptables:

sudo iptables -A FORWARD -o eth0 -i eth1 -s 192.168.3.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

NAT aktivieren:

sudo iptables -t nat -A POSTROUTING -o eth0 --j MASQUERADE

Zum (dauerhaften) Speichern der Regeln installieren wir das folgende Paket:

sudo apt-get install iptables-persistent

Während der Installation (und nur dann!) werden wir gefragt, ob wir die Regeln dauerhaft speichern sollen. Dies bejahen wird für IPv4.

Die Regeln werden übrigens in /etc/iptables/rules.v4 gespeichert. Das Format entspricht dem von iptables-save bzw. iptables-restore. D.h., wenn wir die Regeln irgendwann einmal erweitern, können wir sie wie folgt dauerhaft etablieren:

sudo iptables-save > /etc/iptables/rules.v4

Viel Erfolg!