weidner/archives/2012/03/

Die Paketfilter-Firewall von OpenWrt mit UCI

  1. network
  2. firewall
    1. defaults
    2. include
    3. zone
    4. redirect
    5. rule
  3. Updates
    1. 20150123: Buch zu Paketfilter bei OpenWrt

Nachdem ich mich in den letzen beiden Artikeln mit dem allgemeinen Modell der Paketfiltertabellen in OpenWrt und mit der Abbildung des Webinterfaces LuCI auf dieses Modell befasst habe, beende ich diese kleine Serie zur OpenWrt-Firewall mit ein paar Worten zur Konfiguration mit UCI, dem Universal Configuration Interface und dessen Kommandozeilenprogramm uci.

Dieses insbesondere im Hinblick darauf, dass auf manchen Geräten, auf denen OpenWrt läuft, LuCI aus Platzmangel nicht installiert werden kann.

Zur leichteren Orientierung folge ich in diesem Artikel in etwa dem Aufbau des vorigen über die Konfiguration mit LuCI. Die Kenntnis jenes Artikels hilft beim Verständnis dieses. Außerdem setze ich ein grundlegendes Verständnis der Konfiguration von OpenWrt mit UCI und des Kommandozeilenprogramms uci voraus. Die Dokumentation zu UCI bei openwrt.org kann da weiterhelfen.

Für die Firewall-Konfiguration sind die beiden Dateien /etc/config/network und /etc/config/firewall zuständig. Weitere Informationen über den aktuellen Systemzustand sind in den entsprechenden Dateien im Verzeichnis /var/state/.

Damit die Änderungen an der Firewall-Konfiguration aktiv werden, müssen diese am Ende mit den folgenden beiden Befehlen bestätigt und aktiviert werden:

# uci commit firewall
# /etc/init.d/firewall restart

network

Wie beim Artikel zu LuCI kurz angedeutet, entsprechen die in den Firewall-Zonen verwendeten Netzwerke, denen, die in der Netzkonfiguration definiert wurden. Diese können wir uns mit uci -P /var/state show network anzeigen lassen.

firewall

Die aktuellen Einstellungen und den Zustand der Firewall können wir mit uci -P /var/state firewall anschauen.

defaults

Die allgemeinen Einstellungen stehen in der Sektion firewall.@default[0]. Diese bekommen wir mit uci show firewall.@defaults[0] angezeigt.

syn_flood
Mit dem Wert 1 schalten wir den Schutz vor SYN-Flood-Atacken ein.
drop_invalid
Mit dem Wert 1 an dieser Stelle werden ungültige Datenpakete gleich verworfen, und laufen nicht durch die anderen Regelketten.
input, output, forward
Hier wird die Policy für die entsprechence Kette der Filtertabelle (INPUT, OUTPUT, FORWARD) festgelegt.

include

Die Sektion firewall.@include[0] legt die Datei fest, die am Ende der Konfiguration durch UCI ausgeführt wird. Per default ist das die Datei /etc/firewall.user.

Diese Datei wird nach der Konfiguration der Regeln durch UCI aufgerufen. Da es sich um ein Shell-Script handelt, muss vor den Regeln der Befehl iptables stehen, mit denen diese gesetzt werden.

Weil in etlichen Ketten bereits die endgültigen Targets ACCEPT, DROP, REJECT oder auch RETURN angesprungen werden, ist es oft nicht sinnvoll, Regeln mit -A kette anzufügen. Einfügen am Anfang mit -I kette ist sicherer.

Im Zweifelsfall ist es angebracht, sich die aktuelle Firewallkonfiguration zu visualisieren und damit eine geeignete Stelle in den Regelketten für die zusätzlichen Regeln zu bestimmen.

Alternativ können auch alle von UCI erstellten Regeln entfernt und komplett durch eigene ersetzt werden.

zone

Die Firewall-Zonen werden in der Sektion firewall.@zone[x] festgelegt, wobei x von 0 bis zur Anzahl der Zonen - 1 läuft. Der Wert -1 für x steht für die letzte Zone und ist insbesondere nützlich, wenn man eine neue Zone hinzufügt.

name
Für die Referenzierung an anderer Stelle ($zone).
network
Das Netzwerk, das zu dieser Zone gehört.
input, output, forwarding
Legt die entsprechende Policy für diese Zone fest. Details dazu siehe im Artikel zu LuCI.
masq
Mit dem Wert 1 wird Masquerading für diese Zone eingeschaltet, das heißt, in der Kette zone_$zone_nat der Iptables-Tabelle nat wird ein Sprung zum Target MASQUERADE eingefügt.
masq_src, masq_dest
Falls Masquerading eingeschaltet ist, kann es mit diesen Einstellungen auf einzelne Netze beschränkt werden.
mtu_fix
Steht hier der Wert 1, wird in der Iptables-Tabelle mangle die Kette zone_$zone_MSSFIX angelegt und darin ein Sprung zu TCPMSS mit der Option --clamp-mss-to-pmtu. Damit wird die PMTU bei darüber laufenden TCP-Verbindungen automatisch korrekt eingestellt.
network
Die Netzwerke aus der Netzkonfiguration, die zu dieser Zone dazugehören. Mehrere Netzwerke werden gegebenenfalls durch Leerzeichen getrennt. Das selbe Netzwerk sollte nicht in zwei verschiedenen Firewall-Zonen auftauchen.
family
Hier können die Zoneneinstellungen auf die Adressfamilien ipv4 oder ipv6 eingeschränkt werden. Fehlt die Angabe, gilt es für beide.
conntrack
Hiermit wird Connection Tracking aktiviert. Das hat keine direkten Auswirkungen auf die Iptables-Regeln.
log
Fügt in einigen Regelketten LOG-Regeln ein, so dass der entsprechende Datenverkehr protokolliert wird.
log_limit
Ermöglicht, den Parameter --limit der LOG-Regeln zu ändern und damit die Anzahl der Protokollnachrichten pro Zeiteinheit nach Bedarf anzupassen.

Generell wird eine neue Zone mit uci add firewall zone angelegt und dann via firewall.@zone[-1] referenziert, um die Werte zu setzen:

# uci add firewall zone
# uci set firewall.@zone[-1].name=dmz
# uci set firewall.@zone[-1].network=DMZ
# uci set firewall.@zone[-1].input=ACCEPT
# uci set firewall.@zone[-1].output=ACCEPT
# uci set firewall.@zone[-1].forward=REJECT

forwarding

Die Weiterleitung von Paketen wird für alle Zonen in der Sektion firewall.@forwarding[x] definiert:

# uci add firewall.forwarding
# uci set firewall.@forwarding[-1].src=$zone1
# uci set firewall.@forwarding[-1].dest=$zone2

Damit wird in der Kette zone_$zone1_forward der Iptables-Tabelle filter ein Sprung zur Kette zone_$zone2_ACCEPT erzeugt, was effektiv den Datenverkehr aus $zone1 nach $zone2 erlaubt.

redirect

Das sind zum Beispiel Port-Weiterleitungen für ankommenden Verkehr bei Masquerading.

Die Einstellungen stehen unter firewall.@redirect[x].

Ein neuer Redirect wird zum Beispiel so angelegt:

# uci firewall add redirect
# uci set firewall.@redirect[-1]._name=abc
# uci set firewall.@redirect[-1].src=wan
# uci set firewall.@redirect[-1].proto=tcp
# uci set firewall.@redirect[-1].src_dport=80
# uci set firewall.@redirect[-1].dest=lan
# uci set firewall.@redirect[-1].dest_ip=1.2.3.4
# uci set firewall.@redirect[-1].dest_port=8080
# uci set firewall.@redirect[-1].target=DNAT

Die Optionen haben die folgende Bedeutung:

_name
Ein beliebiger Name zur Kommentierung.
src
Die Zone, auf die sich die Weiterleitung bezieht ($zone).
proto
Das Protokoll (tcpudp, tcp, udp oder custum, zum Beispiel icmp). Bei tcp, udp und tcpudp ist die Angabe der Ports sinnvoll.
src_dport
Der Port für den ankommenden Verkehr (bei TCP beziehungsweise UDP).
dest_ip
IP-Adresse, an die weitergeleitet werden soll.
dest_port
Der Port an der internen Adresse bei TCP beziehungsweise UDP. Fehlt die Angabe, wird der gleiche genommen wie bei src_dport.
target
SNAT beziehungsweise DNAT, je nachdem, was geändert werden soll.
dest
Die Zielzone für die letzten beiden Regeln bei DNAT (in den Ketten nat_reflection_in und nat_reflection_out).
src_dip
Entspricht der Intended destination address in den Advanced Settings bei LuCI. Die Bedeutung ist abhängig davon, was bei target eingestellt ist. Bei DNAT muss die Zieladresse passen, damit der Redirekt ausgeführt wird, bei SNAT wird die Quelladresse auf diese umgesetzt.
src_mac, src_ip, src_port
Diese erlauben es die passenden Datenpakete genauer zu spezifizieren.
reflection
Mit dem Wert 0 werden die Regeln in den Ketten nat_reflection_in und nat_reflection_out unterdrückt. Das bedeutet, das bei DNAT der Datenverkehr aus anderen Zonen als den direkt beteiligten nicht umgeleitet wird.

rule

Die Regeln für die einzelnen Zonen stehen unter firewall.@rule[x]. Diese werden zum Beispiel so angelegt:

# uci add firewall rule 
# uci set firewall.@rule[-1].src=wan
# uci set firewall.@rule[-1].target=ACCEPT
# uci set firewall.@rule[-1].proto=tcp
# uci set firewall.@rule[-1].dest_port=22

Die Optionen haben folgende Bedeutung:

_name
Ein beliebiger Name zur Kommentierung.
src
Die Zone ($zone), aus der die Datenpakete kommen. Damit wird die Regelkette zone_$zone in der Iptables-Tabelle filter ausgewählt, in der die Regel platziert wird.
proto, src_ip, src_port, dest_ip, dest_port, icmp_type, target
Die Parameter der Regel.
dest
Die Zielzone ($zone2). Wird hier eine Zone ausgewählt, dann endet die Regel statt in einem Sprung zu den Standardtargets (ACCEPT, DROP, REJECT), in einem Sprung zu zone_$zone2_ACCEPT, zone_$zone2_DROP oder zone_$zone2_REJECT, jenachdem, was bei target ausgewählt wurde. Das ist vorteilhaft, wenn mehrere Netzwerkschnittstellen zu dieser Zone gehören.
src_mac
Damit kann die Quelladresse eingeschränkt werden.
family
Beschränkt die Regel auf ipv4 oder ipv6.

Updates

20150123: Buch zu Paketfilter bei OpenWrt

Ich plane im Moment die Informationen zum Paketfilter von OpenWrt in einem Buch zusammen zu fassen. Dieses soll zunächst bei Leanpub herauskommen. Dafür benötige ich Feedback, ob daran interesse besteht.

Posted 2012-03-14
Tags: