commit dc1d490e267e60c7fa9d4a884372d1f22fd0133b Author: Claude Date: Tue Aug 18 11:02:02 2026 +0200 Doku: Router-Setup (DHCP/DNS/NAT für enp7s0 10.0.0.0/24) diff --git a/README.md b/README.md new file mode 100644 index 0000000..d35e4a3 --- /dev/null +++ b/README.md @@ -0,0 +1,221 @@ +# narcissus – Router-Konfiguration + +Dieses Repo dokumentiert die Router-Konfiguration des Servers **narcissus** +(narcissus.fhi.mpg.de). Der Server hat zwei Netzwerkinterfaces und übernimmt +für ein kleines internes Netz die Rollen **Router, Default-Gateway, +Nameserver und DHCP-Server**. + +Die Dateien unter [`config/`](config/) sind 1:1-Kopien der aktiven +Konfiguration auf dem Server (Stand: siehe Git-Log). Das Repo ist reine +**Dokumentation/Backup** – es gibt kein automatisches Deployment. Änderungen +müssen manuell auf dem Server vorgenommen werden (siehe unten) und sollten +danach hier eingecheckt werden, damit Doku und Realität übereinstimmen. + +## Netzwerk-Topologie + +``` + Internet + │ + enp3s0 (WAN, öffentlich) + 141.14.140.128/20 + Gateway: 141.14.128.128 + │ + ┌─────────────────────┐ + │ narcissus (Router) │ + │ ip_forward=1, NAT │ + └─────────────────────┘ + │ + enp7s0 (LAN) + 10.0.0.1/24 + │ + ┌─────────┴─────────┐ + │ 10.0.0.0/24 │ + │ DHCP: .100–.200 │ + │ Clients │ + └───────────────────┘ +``` + +- **WAN**: `enp3s0`, statische öffentliche IP, unverändert wie vorher. +- **LAN**: `enp7s0`, neu eingerichtet, `10.0.0.1/24`, Router = Gateway = DNS + für alle Clients im Netz. + +## Was wurde eingerichtet + +| Bereich | Was | Datei auf dem Server | Kopie in diesem Repo | +|---|---|---|---| +| LAN-Interface | `enp7s0` statisch auf `10.0.0.1/24` | `/etc/network/interfaces` | [`config/network-interfaces`](config/network-interfaces) | +| IP-Forwarding | `net.ipv4.ip_forward=1`, persistent über Reboot | `/etc/sysctl.d/99-router-forwarding.conf` | [`config/sysctl.d/99-router-forwarding.conf`](config/sysctl.d/99-router-forwarding.conf) | +| NAT | Masquerading `10.0.0.0/24` → raus über `enp3s0` | `/etc/nftables.conf` | [`config/nftables.conf`](config/nftables.conf) | +| DHCP + DNS | dnsmasq: DHCP-Pool, Gateway/DNS-Option, DNS-Forwarding | `/etc/dnsmasq.d/lan.conf` | [`config/dnsmasq.d/lan.conf`](config/dnsmasq.d/lan.conf) | +| DNS-Includes aktiviert | eine Zeile in `/etc/dnsmasq.conf` einkommentiert: `conf-dir=/etc/dnsmasq.d/,*.conf` | `/etc/dnsmasq.conf` | – (Rest der Datei ist Debian-Standard, nicht gespiegelt) | + +Installiertes Paket: `dnsmasq` (übernimmt sowohl DHCP- als auch +DNS-Server-Rolle). `nftables` war bereits installiert, wurde aber aktiviert +(`systemctl enable --now nftables`). + +### Details zur dnsmasq-Konfiguration (`config/dnsmasq.d/lan.conf`) + +- `interface=enp7s0` + `bind-interfaces` + `except-interface=enp3s0`: + dnsmasq lauscht **ausschließlich** auf dem LAN-Interface. Das ist absichtlich + so restriktiv, damit auf der öffentlichen WAN-Seite kein offener + DNS-Resolver/DHCP-Server erreichbar ist (Missbrauchsrisiko, z.B. + DNS-Amplification). +- `dhcp-range=10.0.0.100,10.0.0.200,255.255.255.0,12h`: DHCP-Pool, 12h Lease. + `.2`–`.99` bleiben frei für statische Reservierungen/Server, `.201`–`.254` + als Puffer. +- `dhcp-option=option:router,10.0.0.1` / `dhcp-option=option:dns-server,10.0.0.1`: + Clients bekommen den Router selbst als Gateway und als DNS-Server. +- `domain=fhi.mpg.de` / `server=141.14.128.1` / `no-resolv`: DNS-Anfragen aus + dem LAN werden an den institutseigenen DNS-Server weitergeleitet (gleicher + Resolver wie auf der WAN-Seite), interne `fhi.mpg.de`-Hosts bleiben + auflösbar. `no-resolv` verhindert, dass dnsmasq zusätzlich `/etc/resolv.conf` + als Upstream-Quelle einliest (Eindeutigkeit). + +### Details zur nftables-Konfiguration (`config/nftables.conf`) + +- `table inet filter`: unverändert (keine Regeln, Policy `accept` auf + `input`/`forward`/`output`) – **die WAN-Seite wurde bewusst nicht + gehärtet/eingeschränkt**, um die bestehende Erreichbarkeit des Servers + nicht zu verändern. +- `table inet nat` / `chain postrouting`: NAT-Masquerading für Traffic aus + `10.0.0.0/24`, der über `enp3s0` rausgeht. Das ist die einzige Regel, die + tatsächlich nötig ist, damit LAN-Clients ins Internet kommen. + +## Konfiguration anpassen + +Alle Änderungen werden direkt auf dem Server in den Dateien unter `/etc/...` +gemacht (Pfade siehe Tabelle oben), dann der jeweilige Dienst neu geladen +(siehe Befehle unten). Bitte die Änderung danach auch hier ins Repo +übernehmen (Datei in `config/` anpassen + committen), damit die Doku aktuell +bleibt. + +### DHCP-Pool / Lease-Zeit ändern + +In `/etc/dnsmasq.d/lan.conf` die Zeile anpassen, z.B.: + +``` +dhcp-range=10.0.0.50,10.0.0.250,255.255.255.0,24h +``` + +Danach: `systemctl restart dnsmasq` + +### Statische IP-Reservierung für ein Gerät (per MAC) + +In `/etc/dnsmasq.d/lan.conf` (oder eine eigene Datei `/etc/dnsmasq.d/hosts.conf`) +ergänzen: + +``` +dhcp-host=aa:bb:cc:dd:ee:ff,10.0.0.10,mein-server,infinite +``` + +Danach: `systemctl restart dnsmasq` + +### DNS-Upstream ändern (z.B. auf öffentliche Resolver) + +In `/etc/dnsmasq.d/lan.conf` die `server=`-Zeile anpassen/ergänzen, z.B.: + +``` +server=9.9.9.9 +server=1.1.1.1 +``` + +Mehrere `server=`-Zeilen sind möglich (Round-Robin/Fallback). Danach: +`systemctl restart dnsmasq` + +### Lokale Domain / eigene Hostnamen im LAN + +dnsmasq kann zusätzlich als einfacher lokaler DNS-Server für das LAN dienen. +Beispiel in `/etc/dnsmasq.d/lan.conf`: + +``` +address=/server1.lan/10.0.0.10 +``` + +Oder Einträge über `/etc/hosts`-Syntax in einer eigenen Datei einbinden +(`addn-hosts=/etc/dnsmasq.d/lan-hosts`). + +### Weitere Firewall-/Portfreigaben (z.B. Port-Forwarding vom WAN ins LAN) + +In `/etc/nftables.conf`, `table inet nat`, eine `chain prerouting` ergänzen, +z.B. um Port 8080 vom WAN auf einen LAN-Host weiterzuleiten: + +``` +chain prerouting { + type nat hook prerouting priority dstnat; + iifname "enp3s0" tcp dport 8080 dnat to 10.0.0.10:8080 +} +``` + +Danach: `nft -c -f /etc/nftables.conf` (Syntaxcheck) und dann +`systemctl reload nftables` bzw. `nft -f /etc/nftables.conf`. + +⚠️ Falls künftig auch der WAN-Eingang gefiltert werden soll (aktuell bewusst +offen gelassen), unbedingt zuerst SSH-Zugriff (und alle anderen aktiv +genutzten Dienste) explizit erlauben, bevor eine restriktive `policy drop` +auf `chain input` gesetzt wird – sonst sperrt man sich ggf. selbst aus. + +### LAN-Netz/IP-Bereich komplett ändern (z.B. auf ein anderes /24) + +1. `/etc/network/interfaces`: `address` der `enp7s0`-Zeile anpassen. +2. `/etc/dnsmasq.d/lan.conf`: `dhcp-range` und beide `dhcp-option`-Zeilen + (Router/DNS-IP) anpassen. +3. `/etc/nftables.conf`: `ip saddr 10.0.0.0/24` in der NAT-Regel anpassen. +4. Anwenden: `ifreload -a` (oder `ifdown enp7s0 && ifup enp7s0`), + `systemctl restart dnsmasq`, `nft -f /etc/nftables.conf`. + +## Befehle zum Anwenden von Änderungen + +```sh +# dnsmasq-Konfig auf Syntaxfehler prüfen, dann neu laden +dnsmasq --test +systemctl restart dnsmasq + +# nftables-Konfig auf Syntaxfehler prüfen, dann neu laden +nft -c -f /etc/nftables.conf +nft -f /etc/nftables.conf +# bzw. systemctl reload nftables (lädt /etc/nftables.conf neu ein) + +# Netzwerk-Interface-Änderungen anwenden (ifupdown) +ifdown enp7s0 && ifup enp7s0 + +# sysctl-Änderungen anwenden +sysctl --system +``` + +## Troubleshooting / nützliche Befehle + +```sh +# Aktive nftables-Regeln anzeigen +nft list ruleset + +# dnsmasq-Status und Logs +systemctl status dnsmasq +journalctl -u dnsmasq -f + +# Wer bekommt gerade welche DHCP-Lease +cat /var/lib/misc/dnsmasq.leases + +# DNS-Auflösung über den Router testen +dig @10.0.0.1 www.example.com + +# Lauscht dnsmasq wirklich NUR auf enp7s0 (nicht auf der WAN-IP)? +ss -tulpn | grep -E ':53|:67' + +# IP-Forwarding aktiv? +sysctl net.ipv4.ip_forward + +# Interface-/Carrier-Status (z.B. wenn Kabel nicht erkannt wird) +ip -brief addr +ip link show enp7s0 +cat /sys/class/net/enp7s0/carrier +``` + +## Sicherheitshinweise + +- dnsmasq ist bewusst so konfiguriert, dass es **nur** auf `enp7s0` lauscht + (`interface=`, `bind-interfaces`, `except-interface=enp3s0`). Vor jeder + Änderung an dieser Konfiguration prüfen, dass diese Einschränkung erhalten + bleibt – sonst entsteht ein von außen erreichbarer DNS-/DHCP-Dienst. +- Die WAN-Seite (`enp3s0`) wurde absichtlich nicht gefiltert/gehärtet, um + die bestehende Erreichbarkeit (u.a. SSH) nicht zu verändern. Das war eine + bewusste Entscheidung bei der Einrichtung, keine Vergesslichkeit. diff --git a/config/dnsmasq.d/lan.conf b/config/dnsmasq.d/lan.conf new file mode 100644 index 0000000..b3ec14a --- /dev/null +++ b/config/dnsmasq.d/lan.conf @@ -0,0 +1,16 @@ +# Nur auf dem LAN-Interface lauschen (DHCP + DNS) — niemals auf enp3s0 (WAN/öffentlich)! +interface=enp7s0 +bind-interfaces +except-interface=enp3s0 +except-interface=lo + +# DHCP für 10.0.0.0/24 +dhcp-range=10.0.0.100,10.0.0.200,255.255.255.0,12h +dhcp-option=option:router,10.0.0.1 +dhcp-option=option:dns-server,10.0.0.1 +dhcp-authoritative + +# DNS: als Forwarder für den internen DNS/Search-Domain der Institution +domain=fhi.mpg.de +no-resolv +server=141.14.128.1 diff --git a/config/network-interfaces b/config/network-interfaces new file mode 100644 index 0000000..5961e6c --- /dev/null +++ b/config/network-interfaces @@ -0,0 +1,22 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +source /etc/network/interfaces.d/* + +# The loopback network interface +auto lo +iface lo inet loopback + +# The primary network interface +allow-hotplug enp3s0 +iface enp3s0 inet static + address 141.14.140.128/20 + gateway 141.14.128.128 + # dns-* options are implemented by the resolvconf package, if installed + dns-nameservers 141.14.128.1 + dns-search fhi.mpg.de + +# LAN interface (Router/Gateway/DHCP/DNS für 10.0.0.0/24) +allow-hotplug enp7s0 +iface enp7s0 inet static + address 10.0.0.1/24 diff --git a/config/nftables.conf b/config/nftables.conf new file mode 100644 index 0000000..ddae7a5 --- /dev/null +++ b/config/nftables.conf @@ -0,0 +1,22 @@ +#!/usr/sbin/nft -f + +flush ruleset + +table inet filter { + chain input { + type filter hook input priority filter; + } + chain forward { + type filter hook forward priority filter; + } + chain output { + type filter hook output priority filter; + } +} + +table inet nat { + chain postrouting { + type nat hook postrouting priority srcnat; + ip saddr 10.0.0.0/24 oifname "enp3s0" masquerade + } +} diff --git a/config/sysctl.d/99-router-forwarding.conf b/config/sysctl.d/99-router-forwarding.conf new file mode 100644 index 0000000..4234b54 --- /dev/null +++ b/config/sysctl.d/99-router-forwarding.conf @@ -0,0 +1 @@ +net.ipv4.ip_forward = 1