Wie man pf Firewall und Fail2ban unter FreeBSD 12.0 einrichtet

PF (Packet Filter) ist ein BSD-lizensierter Stateful Packet Filter. Er wurde für OpenBSD entwickelt und ist auf viele BSD-Betriebssysteme portiert worden, darunter auch FreeBSD. Die pf-Firewall filtert den TCP/IP-Verkehr, kann NAT (Network Address Translation) durchführen und bietet Bandbreitenkontrolle und Paketpriorisierung.

Diese Anleitung zeigt dir, wie du die PF-Firewall auf einem FreeBSD 12.0-System einrichtest. Wir werden die PF-Firewall aktivieren, die Grundkonfiguration erstellen und anschließend Fail2ban mit der PF-Firewall installieren und einrichten, um IP-Adressen zu sperren.

Voraussetzung

Für diese Anleitung verwenden wir die neueste Version von FreeBSD 12.0 mit 1 GB RAM und 2 CPUs. Stelle sicher, dass du Root-Rechte auf dem System hast.

Was wir tun werden:

  • Aktivieren der pf Firewall
  • Grundlegende Konfiguration der pf Firewall
  • Fail2ban installieren und konfigurieren
  • Fail2ban und pf Firewall einrichten

Schritt 1 – Aktiviere die pf Firewall

Standardmäßig ist das FreeBSD-System mit der pf Firewall integriert. Sie ist in den FreeBSD-Kernel eingebettet, aber der Dienst wird noch nicht auf dem Server ausgeführt.

Die pf-Firewall kann aktiviert werden, indem du die Konfiguration in die Datei „/etc/rc.conf“ einträgst. Führe den folgenden Befehl aus, um die pf-Firewall zu aktivieren.

echo 'pf_enable="YES"' >> /etc/rc.conf
echo 'pf_rules="/usr/local/etc/pf.conf"' >> /etc/rc.conf

Aktiviere dann das pf log für das pf firewall log.

echo 'pflog_enable="YES"' >> /etc/rc.conf
echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf

Jetzt ist die pf-Firewall unter FreeBSD 12.0 aktiviert, aber wir können die pf-Firewall nicht sofort starten. Denn wir müssen unsere Dienste zu den pf-Regeln hinzufügen.

Schritt 2 – Grundlegende Konfiguration der pf Firewall

In diesem Schritt führen wir eine grundlegende Konfiguration der Pf-Firewall durch. Wir erstellen die Pf-Firewall-Konfiguration, definieren die Dienste und erlauben den Zugriff auf unsere Dienste.

Gehe in das Verzeichnis „/usr/local/etc“ und erstelle eine neue Konfiguration namens „pf.conf“ mit dem Editor vim.

cd /usr/local/etc/
vim pf.conf

Lege nun das externe Interface und die IP-Adresse fest.

# Define External Interface and IP Address
ext_if="vtnet0"
ext_ip="SERVER-IP-ADDRESS"

Lege die TCP- und UDP-Dienste fest, die du zulassen willst.

# Define TCP and UDP Services
ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }"
ext_udp_ports="{ domain, ntp }"

Vertraue immer auf die lokale Schnittstelle und IP-Adresse.

# Skip the localhost
set skip on lo0

Richte die Log-Schnittstelle ein.

# Log interface
set loginterface $ext_if

Richte die Standardrichtlinie ein, um alle Verbindungen zum Server zu blockieren und alle ausgehenden Verbindungen vom Server durchzulassen.

# Default Policy
block in all
pass out all keep state

Erlaube das ICMP-Protokoll, um den Server anzupingen.

# Allow Ping
pass inet proto icmp icmp-type echoreq

Erlaube unsere Dienste auf den oben definierten TCP- und UDP-Ports.

# Allow Services and Log
pass in proto tcp from any to any port $ext_tcp_ports
pass in proto udp from any to any port $ext_udp_ports

Protokolliere jeden Zugriff auf das SSH- und HTTP-Protokoll im pflog.

pass log quick proto tcp from any to any port { ssh,http }

Speichern und schließen.

Unten siehst du die fertige Grundkonfiguration.

# Define External Interface and IP Address
ext_if="vtnet0"
ext_ip="139.180.220.96"

# Define TCP and UDP Services
ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }"
ext_udp_ports="{ domain, ntp }"

# Skip the localhost
set skip on lo0

# Log interface
set loginterface $ext_if

# Default Policy
block in all
pass out all keep state

# Allow Ping
pass inet proto icmp icmp-type echoreq

# Allow Services
pass in proto tcp from any to any port $ext_tcp_ports
pass in proto tcp from any to any port $ext_udp_ports

# Log access for ssh and http
pass log quick proto tcp from any to any port { ssh,http }

Überprüfe nun die pf Firewall-Regel, bevor du den Dienst startest, und stelle sicher, dass es keinen Fehler gibt.

service pf check

Starte nun die Dienste pflog und pf mit dem folgenden Befehl.

service pflog start
service pf start

Der pf-Dienst wurde gestartet, und deine SSH-Verbindung zum Server wird getrennt. Du kannst dich wieder per SSH mit dem Server verbinden, und zwar über den Port 22, der von der pf-Firewall geöffnet wurde.

Außerdem kannst du die Liste der Pf-Regeln mit der Befehlszeile „pfctl“ (siehe unten) überprüfen.

pfctl -s rules

Du erhältst dann das unten stehende Ergebnis.

Schritt 3 – Fail2ban installieren und konfigurieren

In diesem Schritt installieren wir Fail2ban, aktivieren die Sperrung für den SSH-Dienst und konfigurieren die Fail2ban-Bann-Aktion mit der Pf-Firewall.

Installiere fail2ban mit dem unten stehenden pkg-Befehl.

pkg install py27-fail2ban py27-pyinotify

Sobald die Installation abgeschlossen ist, gehst du in das Verzeichnis „/usr/local/etc/fail2ban“ und erstellst eine neue Jail für den SSH-Dienst im Verzeichnis „jail.d“.

cd /usr/local/etc/fail2ban
vim jail.d/sshd-pf.conf

Füge die unten stehende Konfiguration ein.

[ssh]
enabled  = true
filter   = sshd
action   = pf
logpath  = /var/log/auth.log
findtime  = 600
maxretry = 3
bantime  = 3600

Speichere und schließe.

Als Nächstes erstellst du eine Sicherungskopie der Standardkonfiguration der pf-Aktion im Verzeichnis „action.d“ und erstellst eine neue.

mv action.d/pf.conf action.d/pf.conf.orig
vim action.d/pf.conf

Füge die folgende Konfiguration ein.

[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = /sbin/pfctl -t <tablename> -T add <ip>/32
actionunban = /sbin/pfctl -t <tablename> -T delete <ip>/32
[Init]
tablename = fail2ban

Speichere und schließe.

Füge nun den fail2ban-Dienst zum Systemstart hinzu.

sysrc fail2ban_enable=yes

Starte den Dienst und überprüfe seinen Status.

service fail2ban start
service fail2ban status

Der fail2ban-Dienst läuft unter FreeBSD 12.0 mit der pf-Firewall als Ban-Action.

Schritt 4 – Fail2ban und pf Firewall einrichten

Um die Ban-Aktion für Fail2ban mit der pf-Firewall zu aktivieren, müssen wir die Block-Zusatzkonfiguration zur pf-Konfiguration „pf.conf“ hinzufügen.

Gehe in das Verzeichnis „/usr/local/etc“ und bearbeite die Datei „pf.conf“.

cd /usr/local/etc/
vim pf.onf

Füge die folgende Konfiguration am Ende der Zeile ein.

# Fail2Ban
table <fail2ban> persist
block quick proto tcp from <fail2ban> to $ext_if port ssh

Speichere und schließe.

Lade nun die Firewall-Konfiguration neu

service pf reload

Damit ist die Konfiguration der pf-Firewall und von fail2ban abgeschlossen. Alle IP-Adressen, die von fail2ban abgefangen werden, werden von der pf-Firewall gesperrt.

Schritt 5 – Zusätzlich

Nachfolgend findest du einige Befehle, die du zur Verwaltung der pf firewall verwenden kannst.

Überprüfen des Status der pf firewall

service pf status

Zeige pf firewall Regeln

pfctl -s rules
pfctl -v -s rules

Status der Verbindung zum pf Interface anzeigen

pfctl -s state

Blockierte IP-Adressen in der ‚fail2ban‘-Tabelle anzeigen

pfctl -t fail2ban -T show

Anzeigen der pflog-Datei mit tcpdump

tcpdump -n -e -ttt -r /var/log/pflog

Referenz

Das könnte dich auch interessieren …