Der letzte Teil LAN WAN Brück hatte theoretisch gezeigt, wie das Netzwerk aufgebaut werden sollte und wie ich theoretisch die Regeln für nftables angelegt und virtuell getestet habe.

Stellt sich heraus, dass die Realität anders aussieht, als die Tests, die man durchführt.

Part 1: VLAN Funktionalität auf dem OpenWRT Switch ausschalten ist dämlich, danach gibt es eth0.1 und eth0.2 nicht mehr.

Part 2: Es ist alles schwieriger, als es aussieht.

Part 3: Was zum Geier passiert hier?

Zu Referenzzwecken: Der Router in-question ist ein TP-Link TL-WDR3600 v1 - nicht der Leistungsstärkste, sollte aber mit nftables und der Netzwerkbrücke nicht sonderlich überlastet sein.

Der Hardware-Switch sollte wie folgt - oder vergleichbar - konfiguriert sein, damit der ganze Spaß funktioniert:

Hierbei sollte beachtet werden: CPU eth0.1 und eth0.2 sind die zwei Brücken-Ports, die am Filter beteiligt sind. eth0.1 stellt hierbei das LAN, und eth0.2 das WAN dar. Pakete, die dieser Router nicht mehr benötigt:

  • luci
  • luci-app-firewall
  • firewall
  • iptables & ip6tables
  • kmod-ip*

Vor Einrichtung des ganzen System darauf achten, einmal opkg update durchlaufen zu lassen, sodass im Nachhinein nftables und kmod-nft-bridge installiert werden kann.

Am besten noch dnsmasq löschen, damit hier nicht im Netz rumgepfuscht wird. Bei Bedarf bitte WLAN konfigurieren.

Die OpenWRT Interfaces sollten so konfiguriert sein, dass es die Bridge, sowie zwei alias Interfaces von der Bridge gibt: ipm und lan. Die Bridge selbst hat keine IP. Der Aufbau bei mir ist folgendermaßen:

Um nun gewährleisten zu können, dass die Regeln beim Start auch vorhanden sind, kann rc.local nicht verwendet werden - saubere Sache. Grund ist: eth0.1 und eth0.2 sind zum Start von rc.local nicht bekannt und werfen beim Anwenden der nft-Regeln einen Fehler.

Daher folgender Aufbau:

In /etc/init.d die Datei nft angelegt:

#!/bin/sh /etc/rc.common

START=25
STOP=87

start() {
    nft -f /etc/nftables.conf
}

stop() {
    nft flush ruleset
}

Dies bitte per chmod +x nft und ./nft enable ausführbar machen und für den Start aktivieren.

Nun die nftables-Regeln in /etc/nftables.conf anlegen:

#!/usr/sbin/nft -f
flush ruleset

table bridge filter {
    chain forward {
        type filter hook forward priority filter; policy accept;
        oif "eth0.2" udp sport 68 udp dport 67 drop
        oif "eth0.2" udp sport 546 udp dport 547 drop
        iif "eth0.2" icmp type router-advertisement drop
        iif "eth0.2" icmpv6 type nd-router-advert drop
        oif "eth0.2" icmp type router-solicitation drop
        oif "eth0.2" icmpv6 type nd-router-solicit drop
    }
    chain output {
        type filter hook output priority filter; policy accept;
        oif "eth0.2" udp sport 68 udp dport 67 drop
    }
}

Hiernach muss der Router neugestartet werden - und hoffen, dass das System danach noch erreichbar ist - ansonsten Gerät resetten und von vorne anfangen.

Wie im vorherigen Part gezeigt wollte ich eigentlich per Bridge-Port die Forward-Regeln an ein Ausgangsinterface koppeln - das funktioniert nur nicht so, wie ich mir das vorgestellt hatte mit oif "eth0.2" und oifname "eth0.2" sodass ich auf einen vollständigen Filtern wechseln musste. (Anm.: Das hatte ich eventuell getestet, bevor ich den rc.local-fix durchgeführt hatte, sodass das hier eventuell doch funktioniert. Who knows, Experiment für später.)

Um sowohl DHCPv6 als auch SLAAC blockieren zu können, muss UDP 546 -> UDP 547 sowie ICMPv6 Router Solicit (ähnlich DHCP Discovery) und das Router Advertisement (ähnlich DHCP Offer) blockiert werden. Zur Sicherheit für IPv4 Auto Configuration ebenfalls hier Router Solicitation und Router Advertisement blockieren.

Zur Abrundung des ganzen - der Router selbst soll keine IP aus dem WAN erhalten, sondern nur eine dynamische aus dem LAN - falls gewünscht, sonst die Chain output einfach entfernen. Hierbei ist wichtig, dass von der Bridge niemals auf das Output Interface eth0.2 gegangen werden darf - die Bridge schickt Pakete immer in alle Richtungen, sodass hier einfach die Ausgabe blockiert wird.

Mit diesem Setup kann ich nun überall im LAN ein Gerät anschließen, diesem eine IP im IP-Netz eines WAN-Gerätes zuweisen und kann so ungefiltert und ungeroutet Traffic dorthin switchen.

Previous Post