NAT/Hairpinning mit DynDNS

In diesem Beitrag beschreibe ich ein besonders interessantes Problem was nach knapp einem Jahr Betrieb aufgetreten ist, obwohl vorher alles lief. Mein Setup besteht aus einem PC (Desktop Ubuntu 20.04) auf dem ein virtueller Server (Virtualbox) mit Ubuntu 20.04 läuft. Der virtuelle Server ist mittels dynamischer DNS von Aussen erreichbar. Zur Vereinfachung greife ich auch aus dem internen Netz per FQDN auf den Server zu. So spielt es z.b. keine Rolle ob das Smartphone im Wlan oder per mobile Daten zugreift. Die Adresse ist immer die gleiche. Aber von einem auf dem anderen Tag klappte es aus dem lokalen Netz nicht mehr. Ein Zugriff auf gnude.feste-ip.net war von Intern nicht mehr möglich. Hier lag ein Problem vor das der Router wohl (vielleicht nach einem Firmware Update) Probleme mit dem NAT/Hairpinning hat. Das Problem ist das ein Zugriff aus dem lokalen Netz nicht ins iNet raus und anschliessend sofort wieder zurück geleitet werden kann.

Als Lösung kam dann die Idee in Betracht auf dem bereits vorhandenen Server einfach einen DNS und DHCP Server einzurichten. Mit dem Abschalten des DHCP im Router konnte ich vom eigenen Server auch einen eigenen DNS übergeben. Als Software kam DNSMASQ in Betracht das es die Möglichkeit bietet eine DNS Abfrage abzufangen als auch gleich einen DHCP mit dabei hat. Die Installation ist schnell erledigt mit “apt install dnsmasq” allerdings startet Der Server nicht sofort sondern bricht mit einer Fehlermeldung ab. Ein Systemd-resolver lauscht bereits auf dem Port 53 der für DNS benötigt wird.

Zur Installation habe ich folgende Schritte durchgeführt:
Zunächst habe ich dnsmasq mittels apt installiert:
apt install dnsmasq

Mittels folgenden Befehl habe ich sichergestellt das systemd-resolve wirklich den Port nutzt:
lsof -i -P -n | grep LIST

Als nächstes habe ich den Dienst gestoppt:
systemctl stop systemd-resolved

In der Datei /etc/systemd/resolved.conf müssen folgende Einstellungen gemacht werden:
FallbackDNS=
MulticastDNS=no
DNSSEC=no
DNSOverTLS=no
DNSStubListener=no


Anschliessend folgenden Link erzeugen:
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Nun kann der Dienst wieder gestartet werden:
systemctl start systemd-resolved

In der Datei /etc/dnsmasq.conf habe ich folgende Zeilen ergänzt:
server=80.69.96.12
server=81.210.129.4
dhcp-option=3,192.168.178.1
dhcp-option=6,192.168.178.39
dhcp-range=192.168.178.50,192.168.178.200,12h
address=/gnude.feste-ip.net/192.168.178.39


Start des dnsmasq mit
systemctl start dnsmasq

Zur Erklärung, hinter server habe ich die beiden DNS Server meines Anbieters eingetragen. dhcp-option 3 ist der Gateway, dhcp-option 6 ist der DNS der übergeben wird. In diesem Fall zeigt die DNS auf die eigene IP des Servers. dhcp-range gibt an von bis welche IP Adresse der Adresspool geht und wie lange sie gültig sind.
Die letzte Zeile sogt dafür das alle DNS Anfragen an gnude.feste-ip.net auf den eigenen Server umgeleitet werden.

Damit ist erreicht das der Server selbst als DHCP und DNS fungiert und die Anfragen selbst bearbeitet. Kommt eine Anfrage an gnude.feste-ip.net wird sie direkt auf den eigenen Server geleitet, alle anderen Anfragen gehen an die nächste DNS Instanz, in meinem Fall die hinterlegten IP’s.