Unixery & daemon worship 🔥


It's a Unix system! I know this!

Illumos Firewall Kurzanleitung

In illumos wird IP Filter als Firewall genutzt:

  • IP Filter nutzt last match, d.h. die letzte passende Regel gilt. Es sei denn man nutzt das quick Schlüsselwort. Ist das in einer Regel vorhanden, wird die Verarbeitung bei der Regel abgebrochen.
  • IP Filter gibt es auch für FreeBSD, wird dort aber wohl nicht mehr weiterentwickelt.

Firewall aktivieren

Die Firewall muss aktiviert werden:

svcadm enable network/ipfilter

Ohne weitere Konfiguration ist der Traffic In und Out erlaubt.

Regeln

Die Standarddatei für die Firewallregeln liegt unter /etc/ipf/ipf.conf:

#
# ipf.conf
#
# IP Filter rules to be loaded during startup
#
# See ipf(5) manpage for more information on
# IP Filter rules syntax.

Diese wird beim Start des Services eingelesen.

Wenn Änderungen an der Datei gemacht wurden, können die neuen Regeln folgendermaßen neu eingelesen werden:

ipf -Fa -f /etc/ipf/ipf.conf

Dabei löscht -Fa die aktiven Regeln (Flush) und -f gibt die Datei an, aus der Regeln geladen werden sollen.

Regeln im Betrieb hinzufügen

Sollen Regeln im laufenden Betrieb hinzugefügt werden, dann geht das folgendermaßen:

echo "block in quick from 1.2.3.4 to any" | ipf -f -

Die hinzugefügten Regeln sind nicht persistent!

Aktive Regeln anzeigen

Die aktiven Regeln lassen sich anzeigen:

# ipfstat -io
empty list for ipfilter(out)
block in quick from 1.2.3.4/32 to any

Berechtigungen

Einem Standardbenutzer können Berechtigungen erteilt werden, die Regeln zu ändern. Dazu wird RBAC benutzt:

usermod -P "IP Filter Management" user1

Der Benutzer kann dann via pfexec die Regeln ändern, z.B. pfexec ipf -Fa -f /etc/ipf/ipf.conf

Beispiel-Regeln

Hier ein paar Beispielregeln für einen Webserver:

# block all incoming traffic and watch further, pass all outgoing traffic
block in all
pass out quick all keep state

# no restrictions on loopback interface
pass in quick on lo0 all
pass out quick on lo0 all

# block fragments and too short tcp packets
block in quick with frags
block in quick proto tcp from any to any with short

# block source routed packets
block in quick with opt lsrr
block in quick with opt ssrr

# block anything with special options
block in quick with ipopts

# block OS fingerprint attempts and log first occurrence
block in log first quick proto tcp from any to any flags FPU

# allow connections to sshd on interface e1000g
pass in on e1000g0 proto tcp from any to any port = ssh flags S keep state

# allow connections to web server
pass in proto tcp from any to any port = http flags S keep state
pass in proto tcp from any to any port = https flags S keep state
pass in proto udp from any to any port = https keep state

Zones

Für jede non-global zone gibt es zwei Regelsätze:

  • in-zone
  • Global Zone-controlled (GZ-controlled)

Aus der ipf man page:

Each non-global zone has two ipfilter instances: the in-zone ipfilter, which can be controlled from both the zone itself and the global zone, and the Global Zone-controlled (GZ-controlled) instance, which can only be controlled from the Global Zone. The non-global zone is not able to observe or control the GZ-controlled ipfilter.

ipf optionally takes a zone name as an argument, which will change the ipfilter settings for that zone, rather than the current one. The zonename option is only available in the Global Zone. Using it in any other zone will return an error. If the -G option is specified with this argument, the Global Zone-controlled ipfilter is operated on. If -G is not specified, the in-zone ipfilter is operated on. Note that ipf differs from the other ipfilter tools in how the zone name is specified. It takes the zone name as the last argument, while all of the other tools take the zone name as an argument to the -G and -z options.

  • Eingehende Pakete passieren erst die GZ-controlled Firewall, dann die in-zone Firewall.
  • Ausgehende Pakete passieren erst die in-zone Firewall, dann die GZ-controlled Firewall.

Die Zone kann die GZ-controlled Firewall weder ändern, noch auslesen.

in-zone Regeln

Die in-zone Regeln können also innerhalb der Zone verwaltet werden oder aus der Global Zone. Voraussetzung ist allerdings, dass in der Zone auch der Firewall-Service mit svcadm enable network/ipfilteraktiviert wurde.

Von der Global Zone aus, können die in-zone Regeln z.B. folgendermaßen geändert werden:

ipf -Fa -f /etc/ipf/ipf.conf <zonename>
echo "block in quick from 1.2.3.4 to any" | ipf -f - <zonename>

Falls man einen Fehler 1:ioctl(add/insert rule): I/O error beim Ändern der Regeln bekommt, dann muss IP Filter aktiviert werden. Dies kann der Fall sein, wenn man zwar den Firewall-Service in der Zone aktiviert hat, dort aber keine Firewallregeln unter /etc/ipf/ipf.conf abgelegt hat:

ipf -E <zonename>

Die in-zone Regeln anzeigen:

# ipfstat -z <zonename> -ioh
empty list for ipfilter(out)
0 block in quick from 1.2.3.4/32 to any

Global Zone-controlled (GZ-controlled) Regeln

Die GZ-controlled Regeln müssen ebenfalls erst aktiviert werden und werden dann folgendermaßen geändert:

ipf -GE <zonename>
ipf -G -Fa -f /etc/ipf/ipf.conf <zonename>
echo "block in quick from 1.2.3.4 to any" | ipf -G -f - <zonename>
ipfstat -G <zonename> -ioh

Wenn GZ-controlled Regeln automatisch beim Start der Zone erstellt werden sollen, dann werden sie unter /zones/<zonename>/etc/ipf.conf oder /zones/<zonename>/conf/ipf.conf abgespeichert.