ipadm: Port-Forwarding hinzufügen (-pa/-pl/-pd) + nftables-Include verdrahten

- ipadm verwaltet jetzt auch WAN->LAN Port-Forwards, referenziert per
  Hostname aus der bestehenden Host-DB (folgt IP-Änderungen automatisch)
- ipadm -u generiert zusätzlich /etc/nftables.d/portforward.conf, validiert
  via 'nft -c -f' und reloadet nftables (Rollback bei ungültiger Config,
  wie beim dnsmasq-Teil)
- /etc/nftables.conf bindet dafür neu /etc/nftables.d/*.conf ein
- Host-Store-Locking-Logik in generischen LineStore[T] extrahiert, von
  Host- und PortForward-Store gemeinsam genutzt
This commit is contained in:
2026-08-18 11:43:29 +02:00
parent cfb184eebe
commit 8591223aca
8 changed files with 653 additions and 147 deletions
+10 -10
View File
@@ -51,9 +51,11 @@ mehr von Hand in `dnsmasq.d` gepflegt, sondern über das Tool
| 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) |
| Port-Forwarding-Include | `/etc/nftables.conf` bindet `/etc/nftables.d/*.conf` ein (dort generiert `ipadm` die Port-Forward-Regeln) | `/etc/nftables.conf` (Zeile am Ende) | [`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) |
| Statische Hosts (DHCP-Reservierung + DNS) | von `ipadm` generiert, **nicht** von Hand editieren | `/etc/dnsmasq.d/hosts.conf` (generiert) + `/etc/ipadm/hosts` (Datenbank) | – (live Daten, siehe [`tools/ipadm/`](tools/ipadm/)) |
| Port-Forwards (WAN → LAN-Host) | von `ipadm` generiert, **nicht** von Hand editieren | `/etc/nftables.d/portforward.conf` (generiert) + `/etc/ipadm/portforwards` (Datenbank) | – (live Daten, siehe [`tools/ipadm/`](tools/ipadm/)) |
| dnsmasq-Resilienz | `Restart=on-failure` (Default war `no`), damit dnsmasq bei einem Boot-Race mit `enp7s0` nicht dauerhaft tot bleibt | `/etc/systemd/system/dnsmasq.service.d/override.conf` | [`config/systemd/dnsmasq.service.d/override.conf`](config/systemd/dnsmasq.service.d/override.conf) |
Installiertes Paket: `dnsmasq` (übernimmt sowohl DHCP- als auch
@@ -141,20 +143,18 @@ 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)
### Port-Forwarding (WAN → LAN-Host)
In `/etc/nftables.conf`, `table inet nat`, eine `chain prerouting` ergänzen,
z.B. um Port 8080 vom WAN auf einen LAN-Host weiterzuleiten:
Wird über `ipadm` verwaltet, siehe [tools/ipadm/README.md](tools/ipadm/README.md).
Kurzform: Zielhost muss zuerst als Host in `ipadm` angelegt sein, dann:
```
chain prerouting {
type nat hook prerouting priority dstnat;
iifname "enp3s0" tcp dport 8080 dnat to 10.0.0.10:8080
}
```sh
ipadm -pa <hostname> <wan-port> [lan-port] [tcp|udp|both]
ipadm -u # generiert /etc/nftables.d/portforward.conf neu + reloadet nftables
```
Danach: `nft -c -f /etc/nftables.conf` (Syntaxcheck) und dann
`systemctl reload nftables` bzw. `nft -f /etc/nftables.conf`.
Nicht mehr von Hand in `/etc/nftables.conf` eintragen — die Datei bindet
dafür `/etc/nftables.d/*.conf` ein, das ist der von `ipadm` verwaltete Teil.
⚠️ Falls künftig auch der WAN-Eingang gefiltert werden soll (aktuell bewusst
offen gelassen), unbedingt zuerst SSH-Zugriff (und alle anderen aktiv