IT Security/Firewall

OpenWrt Firewall – von der Standardkonfiguration zur ersten eigenen Regel

OpenWrt ist eine quelloffene Linux-Distribution für Router und eingebettete Netzwerkgeräte. Die Firewall ist dabei kein eigenständiges Produkt, sondern eine Konfigurationsschicht über dem Linux-Paketfilter (Netfilter). Sie wird zentral und deklarativ über UCI in der Datei /etc/config/firewall gepflegt und folgt einem zonenbasierten Modell. Diese Seite führt vom Aufbau der Standardkonfiguration über das Zonenmodell bis zum Anlegen der ersten eigenen Regel.

Architektur: fw4, fw3 und nftables

Seit OpenWrt 22.03 ist fw4 (firewall4) das Standard-Backend. fw4 liest die UCI-Konfiguration und erzeugt daraus ein nftables-Regelwerk. Ältere Versionen bis 21.02 nutzten fw3, das stattdessen iptables-Regeln erzeugte. Die UCI-Syntax in /etc/config/firewall ist zwischen beiden weitgehend kompatibel, sodass bestehende Konfigurationen meist unverändert übernommen werden. Der Ansatz ist deklarativ: Man beschreibt Zonen und erlaubte Verbindungen, das Tooling übersetzt das in den konkreten Paketfilter.

Das Zonenmodell

Interfaces werden zu Zonen zusammengefasst. Policies und Weiterleitungen werden zwischen Zonen definiert, nicht je Interface. Jede Zone besitzt drei Default-Policies:

  • input – Verkehr von der Zone an den Router selbst.
  • output – Verkehr vom Router selbst in die Zone.
  • forward – Verkehr zwischen Interfaces innerhalb derselben Zone.

Jede Policy kann ACCEPT (annehmen), REJECT (ablehnen mit Fehlermeldung) oder DROP (still verwerfen) sein. Die Standardinstallation definiert zwei Zonen:

  • lan – input ACCEPT, output ACCEPT, forward ACCEPT. Das interne Netz; voll vertrauenswürdig.
  • wan – input REJECT, output ACCEPT, forward REJECT, zusätzlich masq '1' (NAT/Masquerading) und mtu_fix '1'. Umfasst die Interfaces wan und wan6; gilt als nicht vertrauenswürdig.

Verbindungen zwischen Zonen sind nur erlaubt, wenn eine ausdrückliche forwarding-Regel existiert. Standardmäßig gibt es eine Weiterleitung lan → wan, damit interne Clients ins Internet gelangen. Es gibt bewusst keine Weiterleitung wan → lan – das interne Netz ist von außen nicht erreichbar.

Aufbau von /etc/config/firewall

Die Konfiguration besteht aus typisierten UCI-Sektionen:

  • config defaults – globale Vorgaben (z. B. syn_flood, globale input/output/forward-Policy, flow_offloading).
  • config zone – definiert eine Zone (name, network-Liste, input, output, forward, masq, mtu_fix).
  • config forwarding – erlaubt Verkehr von einer Quellzone (src) in eine Zielzone (dest).
  • config rule – feingranulare Einzelregel für Verkehr an den Router oder durch ihn.
  • config redirect – Portweiterleitung (DNAT) bzw. Quell-NAT (SNAT).

Beispiel der standardmäßigen wan-Zone in UCI-Textform:

bashKlick markiert alles · Strg + C
config zone
        option name 'wan'
        list network 'wan'
        list network 'wan6'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'

Konfigurationswege

Dieselbe UCI-Konfiguration lässt sich auf drei gleichwertigen Wegen pflegen:

1. LuCI (Weboberfläche)

Menü Network → Firewall mit den Tabs General Settings (Zonen und Forwardings), Port Forwards (redirect) und Traffic Rules (rule). Anfängerfreundlich; Save & Apply lädt die Firewall automatisch neu.

2. UCI-Kommandozeile

bashKlick markiert alles · Strg + C
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-SSH-WAN'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].proto='tcp'
uci set firewall.@rule[-1].dest_port='22'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall

3. Datei direkt editieren

Die Datei /etc/config/firewall lässt sich auch direkt mit einem Editor (z. B. vi) bearbeiten. Nach jeder Änderung muss die Firewall neu geladen werden:

bashKlick markiert alles · Strg + C
/etc/init.d/firewall reload

Die erste eigene Regel

Eingehenden Dienst erlauben (SSH aus dem WAN)

Eine rule, die Verkehr an den Router selbst (input der wan-Zone) zulässt:

bashKlick markiert alles · Strg + C
config rule
        option name 'Allow-SSH-WAN'
        option src 'wan'
        option proto 'tcp'
        option dest_port '22'
        option target 'ACCEPT'

Hinweis: SSH aus dem Internet offen zu legen ist riskant – besser per option src_ip auf bekannte Quell-IPs einschränken oder nur über VPN erreichbar machen.

Portweiterleitung (DNAT)

Externer Port 8080 auf den internen Webserver 192.168.1.50:80:

bashKlick markiert alles · Strg + C
config redirect
        option name 'Web-Forward'
        option src 'wan'
        option src_dport '8080'
        option dest 'lan'
        option dest_ip '192.168.1.50'
        option dest_port '80'
        option proto 'tcp'
        option target 'DNAT'

Zonen trennen (Gastnetz)

Ein zusätzliches Gäste-WLAN als eigene Zone guest, das nur ins Internet, aber nicht ins LAN darf: forward der guest-Zone auf REJECT belassen und ausschließlich eine forwarding guest → wan anlegen – keine forwarding guest → lan. So bleibt das Gastnetz vom internen Netz isoliert (Prinzip der minimalen Rechte).

Regelwerk prüfen

  • Aktive Konfiguration anzeigen: uci show firewall
  • Erzeugtes nftables-Regelwerk (fw4): nft list ruleset
  • Ältere Systeme mit fw3 (iptables): iptables -L -v -n
  • Logging je Regel über option log '1'; Meldungen erscheinen via logread.
bashKlick markiert alles · Strg + C
nft list ruleset

Praxis-Empfehlungen

  • Nur das Nötigste freigeben: keine pauschalen Zonen-Forwardings, sondern gezielte rule/redirect-Einträge mit konkretem Protokoll und Port.
  • wan-Input grundsätzlich auf REJECT/DROP belassen; Dienste am Router nicht unnötig ins Internet öffnen.
  • Weniger vertrauenswürdige Netze (Gast-WLAN, IoT) als eigene Zone mit forward REJECT anlegen und nur Forwarding zur wan-Zone erlauben.
  • Regeln mit aussagekräftigem option name versehen und vor größeren Änderungen ein Backup von /etc/config/firewall anlegen.
  • Den syn_flood-Schutz in der defaults-Sektion aktiviert lassen.

Quellen