Die Paketfilter-Firewall von OpenWrt mit UCI
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 TargetMASQUERADE
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 zuTCPMSS
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
oderzone_$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