FreeBSD PF Firewall

Einführung



Es gibt viele Artikel zum Einrichten von FreeBSD und PF auf dem Runet, aber alle sind verstreut und unsystematisch. Und für mehr oder weniger interessante Dinge, wie das Routing mittels einer Firewall (Policy Based Routing), müssen Sie die Originaldokumentation lesen, zum Beispiel die FAQ zu OpenBSD PF . Es gibt jedoch Unterschiede in der Befehlssyntax für FreeBSD und OpenBSD. In dieser Artikelserie versuchen wir, die Fähigkeiten von PF von einfach bis komplex zu systematisieren und zu analysieren. Dieser Einführungsartikel ähnelt mit Sicherheit allen anderen Artikeln zum Paketfilter. Daher sind diejenigen, die bereits mit den Grundfunktionen vertraut sind, nicht interessiert. Auf eine Einführung kann man jedoch nicht verzichten, und das Fleisch wird in den folgenden Artikeln enthalten sein.





PF - Packet Filter ist eine Firewall, die ursprünglich vom OpenBSD-Projekt erstellt wurde. 2003 auf FreeBSD portiert. Im Jahr 2004 wurde es in das Hauptsystem integriert. Hauptmerkmale:



  • Filterung basierend auf Adressen, Ports, Protokollen, Schnittstellen
  • NAT - Quell-NAT, Ersetzung der Absenderadresse. Ziel nat, Fälschung der Empfängeradresse, Portweiterleitung
  • Scrub - Normalisierung des Netzwerkverkehrs. Hilft bei einigen Arten von Dos-Angriffen, die auf der Bildung speziell vorbereiteter Pakete basieren
  • SYN-Proxy - Schutz vor SYN-Flood-Angriffen
  • Verbindungen ausgleichen
  • — pfcync , , CARP, ,
  • ( IP-, 2 )
  • — IP
  • — ,
  • (anchors) — , IPTables Linux
  • pfstat


Der Hauptunterschied zu denselben IPTables ist das ungewöhnliche Arbeitsschema. Die Stapelverarbeitung endet nicht nach der ersten Regelübereinstimmung. Das heißt, wenn Sie die erste Regel auf "Alles ablehnen" setzen , wird das Paket nicht verworfen, sondern als verboten markiert. Es wird gemäß den Regeln weiter ausgeführt. Wenn keine Regel dies zulässt, wird es verworfen . Dies ist wichtig zu verstehen und zu verwenden. Falls gewünscht, kann dieses Verhalten jedoch durch den Parameter quick in der Regel überschrieben werden .



Management und hilfreiche Befehle



Um PF zu aktivieren, reicht es aus, die Optionen in der Datei "/etc/rc.conf" anzugeben:



pf_enable="YES" #  pf   
pf_flags="" #   pfctl
pf_rules="/etc/pf.conf"  #  
pflog_enable="YES" #  pflog
pflog_flags="" #  pflog
pflog_logfile="/var/log/pflog" #  

      
      





Grundlegende Firewall-Befehle:



pfctl - # Firewall

aktivieren pfctl -d # Firewall

deaktivieren pfctl -nf # Syntax der

pfctl- Datei überprüfen -f # Regeln aus Datei

pfctl -Rf erneut lesen # Filterregeln aus Datei

pfctl -Nf erneut lesen # NAT-Regeln aus Datei

pfctl erneut lesen -sa # Alle Zustände

anzeigen pfctl -s #

Filterregeln anzeigen pfctl -sn # NAT-Regeln

anzeigen pfctl -s Anker -v #

Ankerbaum anzeigen pfctl -ss # Aktuelle Verbindungen anzeigen



Struktur der Konfigurationsdatei und Grundeinstellungen



Die Konfigurationsdatei besteht aus folgenden Abschnitten:



  1. Makros
  2. Tabellen
  3. Optionen
  4. Verkehrsnormalisierungsregeln (Scrub)
  5. Warteschlangen, Priorisierung und Geschwindigkeitskontrolle
  6. NAT-Adressübersetzung
  7. Paketfilterung


Regeln haben im Allgemeinen die folgende Syntax:



action [direction] [log] [quick] [on interface] [af] [proto protocol]
          [from src_addr [port src_port]] [to dst_addr [port dst_port]]
          [flags tcp_flags] [state]

      
      





Aktion - was mit dem Paket geschehen soll

Richtung - in aus,

melden Sie sich Richtung - ob das Paket in pflog bekommt

schnell - wenn das Paket unter dieser Regel fällt, dann wird es keine weitere Verarbeitung sein. Diese Regel ist die letzte für das

Schnittstellenpaket - der Name der Netzwerkschnittstellen-

Af- Adressfamilie, inet oder inet6, IPv4 oder IPv6 bzw.

Protokoll- Schicht-4-Protokoll, zum Beispiel: tcp, udp, icmp

scr_addr, dst_addr - source und Zieladressen

src_port, dst_port -

tcp_flags ports - tcp flags

state - Optionen zum Speichern des Status. Zum Beispiel würde "Status behalten" bedeuten, dass die Verbindung in der Statustabelle beibehalten wird und Antwortpakete durchlaufen werden können. Standardverhalten.



Nehmen Sie den einfachsten Webserver im luftleeren Raum. Es ist notwendig, eingehende Verbindungen an den TCP-Ports 22, 80, 443 (ssh, http, https) zu öffnen. Sie müssen auch ausgehende Verbindungen an den TCP-Ports 22, 80, 443 (ssh, http, https) und udp 53, 123 (dns und ntp) öffnen. Verbiete alles andere.



# ee pf.conf

#macros section
permit_tcp_ports="22,80,443"
permit_udp_ports="53,123"

#table section
#    

#options section
set block-policy return #    ,     
set skip on lo0 #     ,    

#scrub section
scrub in all #    

#Queueing section
#    

#nat section
# ,    


#filtering section
block all #    , ,       .
pass in proto tcp to port { $permit_tcp_ports } #   
pass out proto tcp to port { $permit_tcp_ports } #    tcp
pass out proto udp to port { $permit_udp_ports } #    udp
pass out inet proto icmp #   icmp

      
      





Dann geben wir den Befehl zur Syntaxprüfung ein:

pfctl -nf pf.conf



Wenn keine Fehlermeldungen angezeigt werden, geben Sie den Befehl zum

Anwenden der Regeln ein: pfctl -f pf.conf



Zum Überprüfen sehen wir uns die Filterregeln an:



# pfctl -sr 
scrub in all fragment reassemble 
block return all 
pass out proto tcp from any to any port = ssh flags S/SA keep state 
pass out proto tcp from any to any port = http flags S/SA keep state 
pass out proto tcp from any to any port = https flags S/SA keep state 
pass out proto udp from any to any port = domain keep state 
pass out proto udp from any to any port = ntp keep state 
pass out inet proto icmp all keep state 
pass in proto tcp from any to any port = ssh flags S/SA keep state 
pass in proto tcp from any to any port = http flags S/SA keep state 
pass in proto tcp from any to any port = https flags S/SA keep state 
      
      





Wie Sie sehen können, werden die Makros für jeden Port in separate Regeln erweitert. Die Reihenfolge wird automatisch geändert. Ansonsten ist alles so, wie es sein sollte.



Ergebnis



Wir haben herausgefunden, was Paketfilter ist, und seine Hauptfunktionen kennengelernt. Hat die Struktur der PF-Konfiguration und ihrer Hauptabschnitte herausgefunden. Wir haben die einfachste Konfiguration erstellt, die jedoch recht funktional ist, einschließlich Makros, Paketnormalisierung und Filterung eingehender und ausgehender Pakete. Im nächsten Artikel werden Filterregeln, Statusverwaltung und Flags genauer betrachtet.



Unsere Lösung, Internet Control Server, ist ein Sicherheitsgateway, das auf FreeBSD aufbaut. Dieses System wurde aufgrund seiner Stabilität, Geschwindigkeit des Netzwerkstapels, der integrierten ZFS-Unterstützung im Kernel und des Fehlens von Lizenzproblemen ausgewählt. Auch die Arbeit mit FreeBSD macht Spaß, wenn auch nicht einfach. Gerne teilen wir diese Erfahrung mit Ihnen!



All Articles