FreeBSD-Firewall-Konfiguration mit IPFW
IPFW ist eine zustandsbehaftete Firewall, die mit IPv4 und IPv6 kompatibel ist und für FreeBSD entwickelt wurde.Es besteht aus dem Kernel-Firewall-Filterregelprozessor mit seiner integrierten Paketabrechnungseinrichtung, der Protokollierungseinrichtung, NAT, dem Dummynet-Verkehrsformer, einer Weiterleitungseinrichtung, einer Bridge-Einrichtung und einer ipstealth
-Einrichtung.
Die Autoren und Betreuer von IPFW sind freiwillige Mitarbeiter von FreeBSD.Seine Syntax erlaubt die Nutzung ausgeklügelter Filtermöglichkeiten, die es den Benutzern ermöglichen, komplexe Anforderungen zu erfüllen.
Die native Firewall von Mac OS X war ipfw bis Mac OS X 10.7 Lion im Jahr 2011, als sie durch das PF-Projekt von OpenBSD ersetzt wurde.ipfw, wie FreeBSD, ist Open Source.Es wird in zahlreichen Firewall-Produkten auf Basis von FreeBSD verwendet, darunter m0n0wall und FreeNAS.Seit Linux 1.1 wurde ein Port einer frühen Version von ipfw als erste Firewall-Implementierung für Linux verwendet, bis es durch ipchains ersetzt wurde.[4]Ein moderner Port von ipfw und dem dummynet Traffic Shaper ist für Linux (einschließlich eines vorgefertigten OpenWrt-Pakets) und Microsoft Windows verfügbar.
FreeBSD enthält ein Beispiel-Regelsatz in /etc/rc.firewall
, der viele Firewall-Typen für typische Umstände angibt, um unerfahrenen Benutzern bei der Entwicklung geeigneter Regeln zu helfen.IPFW bietet eine robuste Syntax, die es erfahrenen Benutzern ermöglicht, maßgeschneiderte Regelsets zu erstellen, die den Sicherheitsanforderungen einer bestimmten Umgebung gerecht werden.
Dieser Artikel erklärt, wie man IPFW aktiviert, bietet einen Überblick über die Syntax seiner Regeln und zeigt viele Regelsets für typische Einrichtungsszenarien.
Zusätzlich zu seinen effektiven L4-Paketfilter- und Routing-Funktionen bietet FreeBSD auch Next-Generation-Firewall-Funktionen wie Webkontrolle und Anwendungskontrolle.Dies wird durch ein externes Tool namens Zenarmor bereitgestellt.
Zenarmor NGFW Erweiterung ermöglicht es Ihnen, Ihre Firewall in Sekundenschnelle auf eine Next Generation Firewall aufzurüsten.NG Firewalls ermöglichen es Ihnen, modernen Cyberangriffen entgegenzuwirken, die jeden Tag raffinierter werden.
Einige der Funktionen sind Layer-7-Anwendungs-/Benutzer-bewusstes Blockieren, granulare Filterrichtlinien, kommerzielles Webfiltering mit cloudbasierter KI-gestützter Bedrohungsintelligenz, Kindersicherungen und die besten Netzwerk-Analysen und -Berichte der Branche.
Die Zenarmor Free Edition ist für alle FreeBSD-Nutzer kostenlos verfügbar. Zenarmor Free Edition ist kostenlos für alle FreeBSD-Nutzer verfügbar.
Wie aktiviert man IPFW?
IPFW wird als kernel-ladbares Modul in der Standardinstallation von FreeBSD bereitgestellt, daher ist kein spezieller Kernel erforderlich, um IPFW zu aktivieren.
Um Ihren FreeBSD-Knoten so zu konfigurieren, dass er mit aktiviertem IPFW bootet, fügen Sie firewall_enable="YES"
zur Datei /etc/rc.conf
hinzu, indem Sie den folgenden Befehl ausführen:
sysrc firewall_enable="YES"
Um einen der Standard-Firewalltypen von FreeBSD zu nutzen, fügen Sie eine weitere Zeile hinzu, die den Typ definiert, indem Sie den folgenden Befehl ausführen:
sysrc firewall type="open"
Dies sind die möglichen Typen:
open
: erlaubt allen Verkehr.client
: schützt einfach diesen Computer.einfach
: Schützt das gesamte Netzwerk.closed
: deaktiviert alle IP-Kommunikation mit Ausnahme der Loopback-Schnittstelle.workstation
: Verwendet zustandsbehaftete Regeln, schützt nur diesen Computer.UNBEKANNT
: verhindert das Laden von Firewall-Regeln.filename
: der gesamte Pfad zur Datei, die das Firewall-Regelsatz enthält.
Wenn firewall_type
auf client
oder simple
gesetzt ist, passen Sie die Standardregeln in /etc/rc.firewall
an die Systemeinstellungen an.
Beachten Sie, dass der filename
-Typ verwendet wird, um ein individuelles Regelset zu laden.
Das Setzen der Firewall-Skript-Variable auf den absoluten Pfad eines ausführbaren Skripts, das IPFW-Befehle enthält, ist eine alternative Methode zum Laden eines benutzerdefinierten Regelsets.Die Beispiele in diesem Abschnitt gehen davon aus, dass /etc/ipfw.rules
das Firewall-Skript ist:
sysrc firewall_script="/etc/ipfw.rules"
Um das Protokollieren mit syslogd zu aktivieren, fügen Sie die folgende Zeile hinzu:
sysrc firewall_logging="YES"
Nur Regeln mit aktivierter Protokollierungsoption werden protokolliert.Diese Option ist nicht in den Standardregeln enthalten; sie muss separat eingeführt werden.Daher wird empfohlen, das Standard-Regelwerk für das Logging zu ändern.Darüber hinaus kann es wünschenswert sein, die Protokolle in einer separaten Datei zu speichern und eine Protokollrotation durchzuführen. Zusätzlich kann es wünschenswert sein, die Protokollrotation durchzuführen, wenn Protokolle in einer separaten Datei gespeichert werden.
Es gibt keine Variable in /etc/rc.conf
, um Protokollierungsgrenzen festzulegen.Um die maximale Anzahl der Protokollierungen einer Regel pro Verbindungsversuch festzulegen, fügen Sie die entsprechende Konfigurationszeile zu /etc/sysctl.conf
hinzu, indem Sie den folgenden Befehl ausführen:
echo "net.inet.ip.fw.verbose_limit=5" >> /etc/sysctl.conf
Um das Protokollieren über eine dedizierte Schnittstelle namens ipfw0
zu aktivieren, fügen Sie die zugehörige Konfigurationszeile zu /etc/rc.conf
hinzu, indem Sie den folgenden Befehl ausführen:
sysrc firewall_logif="YES"
Verwenden Sie dann tcpdump, um die protokollierten Informationen anzuzeigen, indem Sie den folgenden Befehl ausführen::
tcpdump -t -n -i ipfw0
Starten Sie die Firewall und aktivieren Sie die Protokollierungsgrenzen, indem Sie den oben angegebenen sysctl
-Wert festlegen:
service ipfw start
sysctl net.inet.ip.fw.verbose_limit=5
Was ist die IPFW-Regelsyntax?
Wenn ein Paket die IPFW-Firewall erreicht, wird es mit der ersten Regel im Regelwerk verglichen und dann der Reihe nach mit jeder nachfolgenden Regel von oben nach unten.Wenn ein Paket die Auswahlkriterien einer Regel erfüllt, wird die Aktion der Regel ausgeführt und die Suche im Regelwerk für dieses Paket abgeschlossen.Dies ist als "first match wins" bekannt.Wenn das Paket keiner der Regeln entspricht, wird es von der IPFW-Standardregel Nummer 65535
abgefangen, die alle Pakete stillschweigend ablehnt und verwirft.Die Suche wird jedoch fortgesetzt, wenn das Paket einer Regel entspricht, die die Schlüsselwörter count
, skipto
oder tee
enthält.
Schlüsselwörter müssen in der folgenden Reihenfolge angegeben werden, wenn eine IPFW-Regel erstellt wird:Bestimmte Schlüsselwörter sind erforderlich, während andere optional sind.Die Wörter in Großbuchstaben kennzeichnen eine Variable, während die Wörter in Kleinbuchstaben der Variablen, die folgt, vorangestellt werden müssen.Das ``-Zeichen markiert den Beginn einer Bemerkung und kann am Ende einer Regel oder auf einer separaten Zeile stehen.Leere Zeilen werden ignoriert.
CMD RULE_NUMBER set SET_NUMBER ACTION log LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT OPTIONS
Dieser Abschnitt gibt eine Zusammenfassung dieser Schlüsselwörter und ihrer zugehörigen Alternativen.Diese Liste enthält nicht jede mögliche Option.
-
CMD
: Jede Regel muss mit ipfw add beginnen. Jede Regel muss mit ipfw add beginnen. -
REGELNUMMER
: Jeder Regel wird eine Nummer zwischen 1 und 65534 zugewiesen.Die Nummer wird verwendet, um die Verarbeitungsreihenfolge der Regeln anzugeben.Mehrere Regeln mit derselben Nummer können in der Reihenfolge angewendet werden, in der sie eingeführt wurden. -
SET NUMBER
: Jeder Regel wird eine Nummer zwischen 0 und 31 zugewiesen.Sätze können einzeln deaktiviert oder reaktiviert werden, was eine schnelle Hinzufügung oder Löschung von Regelsets ermöglicht.Wenn keine SET-NUMMER angegeben ist, wird die Regel zu Set 0 hinzugefügt.Wenn keine SET NUMMER angegeben ist, wird die Regel zu Set 0 hinzugefügt.
-
AKTION
: Eine der folgenden könnte mit einer Regel in Zusammenhang stehen.Die angegebene Aktion wird durchgeführt, wenn das Paket die Auswahlkriterien der Regel erfüllt.Die angegebene Aktion wird durchgeführt, wenn das Paket die Auswahlkriterien der Regel erfüllt.
allow | accept | pass | permit
: diese Begriffe sind austauschbar und erlauben Pakete, die der Regel entsprechen.check-state
: eine Funktion, die das Paket mit der dynamischen Zustandsdatenbank vergleicht.Führen Sie die Aktion aus, die mit der Regel verbunden ist, die diese dynamische Regel erstellt hat, wenn eine Übereinstimmung festgestellt wird; andernfalls gehen Sie zur nächsten Regel.Eine Check-State-Regel hat keine Auswahlkriterien.Wenn es keinecheck-state
-Regel im Regelset gibt, wird die erstekeep-state
- oderlimit
-Regel in der dynamischen Regelstabelle überprüft.count
: aktualisiert die Zählungen für alle übereinstimmenden Pakete.Die Suche erfolgt nach folgender Regel. Der Suchvorgang erfolgt nach folgender Regel.deny
oderdrop
: beide bewirken, dass Pakete, die dieses Kriterium erfüllen, stillschweigend verworfen werden.
-
LOG AMOUNT
: Wenn ein Paket eine Regel mit dem Schlüsselwort log erfüllt, wird eine Nachricht mit dem Facility-Namen SECURITY in syslogd aufgezeichnet.Das Protokollieren erfolgt nur, wenn die Anzahl der für diese Regel gemeldeten Pakete den Wert von LOG AMOUNT nicht überschreitet.Wenn kein LOG AMOUNT angegeben ist, wird der Wert vonnet.inet.ip.fw.verbose_limit
als Grenze verwendet.Das Protokollierungs-Limit wird aufgehoben, wenn der Wert auf null gesetzt wird.Sobald das Limit erreicht ist, kann das Logging wieder aktiviert werden, indemipfw resetlog
verwendet wird, um den Logging-Zähler oder den Paket-Zähler für diese Regel zu löschen.Nachdem alle anderen Anforderungen für die Paketübereinstimmung erfüllt sind und bevor die endgültige Aktion am Paket durchgeführt wird, wird eine Protokollierung vorgenommen.Der Administrator bestimmt, welche Regeln das Einloggen erlauben.
-
PROTO
: Diese Variable kann verwendet werden, um ein beliebiges Protokoll zu definieren, das in /etc/protocols aufgeführt ist. -
SRC
: Die Quelladresse oder ein Schlüsselwort, das die Quelladresse darstellt, muss dem Schlüsselwort from folgen.Eine Adresse kann durchany
,me
,me6
oder eine Tabelle gefolgt von der Nummer einer Nachschlagetabelle dargestellt werden, die eine Liste von Adressen enthält.Optional kann eine IP-Adresse durch ihre CIDR-Maske oder Subnetzmaske gefolgt werden, wenn angegeben. -
SRC_PORT
: Ein optionaler Quellport kann angegeben werden, entweder durch die Portnummer oder den Namen aus/etc/services
. -
DST
: Die Zieladresse oder ein Schlüsselwort, das die Zieladresse darstellt, muss dem Schlüsselwortto
folgen.Die gleichen Schlüsselwörter und Standorte, die zur Definition der Quelle verwendet wurden, können auch zur Angabe des Ziels verwendet werden.Der gleiche Schlüsselwörter und Standorte, die zur Definition der Quelle verwendet wurden, können auch verwendet werden, um das Ziel zu bestimmen.
-
DST_PORT
: Ein optionaler Zielport kann angegeben werden, entweder durch die Portnummer oder den Namen aus/etc/services
. -
OPTIONS
: Mehrere Schlüsselwörter können zwischen Quelle und Ziel eingefügt werden. Wie der Name schon andeutet, sind OPTIONS optional. Häufig verwendete Parameter sindin
oderout
, die die Richtung des Paketflusses bestimmen,icmptypes
gefolgt vom Typ der ICMP-Nachricht, sowiekeep-state
.
Wenn eine keep-state
-Regel erfüllt ist, generiert die Firewall eine dynamische Regel, die bidirektionalen Datenverkehr mit demselben Protokoll zwischen den Quell- und Zieladressen und -ports übereinstimmt.
Die dynamische Regelungsfunktion ist anfällig für Ressourcenerschöpfung infolge eines SYN-Flood-Angriffs, der eine enorme Anzahl dynamischer Regeln öffnen würde.Verwenden Sie limit
, um sich gegen diese Art von Angriff mit IPFW zu verteidigen.Diese Option beschränkt die Anzahl gleichzeitiger Sitzungen, indem sie die offenen dynamischen Regeln untersucht und die Anzahl der Vorkommen dieser Regel und IP-Adresse berechnet.Wenn diese Zahl den Grenzwert überschreitet, wird das Paket abgelehnt.
Wie definiert man das IPFW-Regelsystem?
Dieser Abschnitt zeigt, wie man /etc/ipfw.rules
, ein Beispiel für ein zustandsbehaftetes Firewall-Regelsatz-Skript, schreibt.In diesem Beispiel geben alle Verbindungsregeln die Richtung mit in oder out an.Zusätzlich verwenden sie interface-name, um die Schnittstelle zu identifizieren, über die das Paket fließt.
Beim Entwerfen oder Testen eines Firewall-Regelsatzes zum ersten Mal, ziehen Sie in Betracht, diese Variable vorübergehend zu konfigurieren:
net.inet.ip.fw.default_to_accept="1"
Dies ändert die Standardrichtlinie von ipfw, um liberaler als die default deny ip from any to any
zu sein, was es etwas schwieriger macht, sofort nach einem Neustart aus dem System ausgesperrt zu werden.
Das Firewall-Skript beginnt damit, sich als Bourne-Shell-Skript zu identifizieren und alle aktuellen Regeln zu löschen.Es generiert dann die cmd
-Variable, damit ipfw add
nicht am Anfang jeder Regel erforderlich ist.Zusätzlich wird die pif
-Variable angegeben, die den Namen der mit dem Internet verbundenen Schnittstelle angibt.
!/bin/sh
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
pif="dc0" # interface name of NIC attached to Internet
Die ersten beiden Regeln erlauben allen Verkehr auf den vertrauenswürdigen internen und Loopback-Schnittstellen:
# Change xl0 to LAN NIC interface name
$cmd 00005 allow all from any to any via xl0
# No restrictions on Loopback Interface
$cmd 00010 allow all from any to any via lo0
Die nachfolgende Regel erlaubt es dem Paket, weiterzuziehen, wenn es mit einem vorhandenen Eintrag in der Tabelle der dynamischen Regeln übereinstimmt.
$cmd 00101 check-state
Die folgende Regelung legt fest, welche zustandsbehafteten Verbindungen interne Systeme mit Internet-Hosts herstellen dürfen:
# Allow access to public DNS
# Replace x.x.x.x with the IP address of a public DNS server
# and repeat for each DNS server in /etc/resolv.conf
$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state
$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state
# Allow access to ISP's DHCP server for cable/DSL configurations.
# Use the first rule and check log for IP address.
# Then, uncomment the second rule, input the IP address, and delete the first rule
$cmd 00120 allow log udp from any to any 67 out via $pif keep-state
$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state
# Allow outbound HTTP and HTTPS connections
$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state
$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state
# Allow outbound email connections
$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state
$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state
# Allow outbound ping
$cmd 00250 allow icmp from any to any out via $pif keep-state
# Allow outbound NTP
$cmd 00260 allow udp from any to any 123 out via $pif keep-state
# Allow outbound SSH
$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state
# deny and log all other outbound connections
$cmd 00299 deny log all from any to any out via $pif
Der nachfolgende Regelensatz regelt die Verbindungen von Internet-Hosts zum internen Netzwerk.Es beginnt damit, Pakete abzulehnen, die oft mit Angriffen in Verbindung gebracht werden, und erlaubt dann ausdrücklich bestimmte Arten von Verbindungen.Alle internetbasierten erlaubten Dienste haben eine Geschwindigkeitsbegrenzung, um Überflutungen zu vermeiden.
# Deny all inbound traffic from non-routable reserved address spaces
$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif RFC 1918 private IP
$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif RFC 1918 private IP
$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif RFC 1918 private IP
$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif loopback
$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif loopback
$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif DHCP auto-config
$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif reserved for docs
$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif Sun cluster interconnect
$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif Class D & E multicast
# Deny public pings
$cmd 00310 deny icmp from any to any in via $pif
# Deny ident
$cmd 00315 deny tcp from any to any 113 in via $pif
# Deny all Netbios services.
$cmd 00320 deny tcp from any to any 137 in via $pif
$cmd 00321 deny tcp from any to any 138 in via $pif
$cmd 00322 deny tcp from any to any 139 in via $pif
$cmd 00323 deny tcp from any to any 81 in via $pif
#Deny fragments
$cmd 00330 deny all from any to any frag in via $pif
#Deny ACK packets that did not match the dynamic rule table
$cmd 00332 deny tcp from any to any established in via $pif
#Allow traffic from ISP's DHCP server.
#Replace x.x.x.x with the same IP address used in rule 00120.
$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state
#Allow HTTP connections to internal web server
$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
#Allow inbound SSH connections
$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2
#Reject and log all other incoming connections
$cmd 00499 deny log all from any to any in via $pif
Die letzte Regel protokolliert alle Pakete, die keine der vorhergehenden Regeln erfüllen:
#Everything else is denied and logged
$cmd 00999 deny log all from any to any
Wie implementiert man NAT?
Die IPFW-Firewall auf FreeBSD hat zwei NAT-Implementierungen:
-
die Benutzerland-Implementierung natd(8)
-
die modernere In-Kernel-NAT-Implementierung.
Beide arbeiten in Kombination mit IPFW, um Netzwerkadressen zu übersetzen.Dies kann verwendet werden, um eine Lösung für die gemeinsame Internetnutzung anzubieten, die es mehreren internen Computern ermöglicht, sich über eine einzige öffentliche IP-Adresse mit dem Internet zu verbinden.
Um dies zu tun, muss das mit dem Internet verbundene FreeBSD-System als Gateway fungieren.Dieses System muss über zwei Netzwerkkarten (NICs) verfügen, von denen eine mit dem Internet und die andere mit dem lokalen Netzwerk (LAN) verbunden sein muss.Gemäß RFC 1918 soll jedem Computer, der mit dem LAN verbunden ist, eine IP-Adresse im privaten Netzwerkbereich zugewiesen werden.
IPFW erfordert weitere Einstellungen, um seine NAT-Funktionalität im Kernel zu aktivieren.Um die NAT-Funktionalität im Kernel beim Booten zu aktivieren, muss Folgendes in /etc/rc.conf
konfiguriert werden:
gateway_enable="YES"
firewall_enable="YES"
firewall_nat_enable="YES"
Wenn firewall_nat_enable ohne firewall_enable gesetzt wird, hat es keine Auswirkungen und tut nichts.Da die In-Kernel-NAT-Lösung nur mit IPFW kompatibel ist, ist dies der Fall.
Wenn das Regelwerk zustandsbehaftete Regeln enthält, ist die Platzierung der NAT-Regel entscheidend, und die skipto
-Aktion wird verwendet.Die skipto
-Aktion benötigt eine Regelnummer, um die Zielregel zu identifizieren.Das nächste Beispiel erweitert die in der vorhergehenden Sektion vorgestellte Firewall-Regelung.Um die Firewall für In-Kernel-NAT einzurichten, fügt sie einige zusätzliche Einträge hinzu und ändert bestimmte bestehende Regeln.Es beginnt damit, Variablen hinzuzufügen, die die Regel repräsentieren, zu der gesprungen werden soll, die keep-state
-Option und eine Liste von TCP-Ports, die verwendet werden, um die Anzahl der Regeln zu verringern.
!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add"
skip="skipto 1000"
pif=dc0
ks="keep-state"
good_tcpo="22,25,37,53,80,443,110"
Aufgrund des Designs von libalias
, einer als Kernelmodul erstellten Bibliothek, die die NAT-Funktionalität von IPFW im Kernel bereitstellt, muss TCP-Segmentierungs-Offloading (TSO) deaktiviert werden, während das in-kernel NAT verwendet wird.TSO kann pro Netzwerkschnittstelle mit ifconfig
oder global mit sysctl
deaktiviert werden.Um TSO global zu deaktivieren, müssen die folgenden Parameter in /etc/sysctl.conf
angegeben werden:
net.inet.tcp.tso="0"
Zusätzlich wird eine NAT-Instanz eingerichtet.Mehrere NAT-Instanzen, jede mit ihren eigenen Einstellungen, sind möglich.Für dieses Beispiel ist nur eine NAT-Instanz, NAT-Instanz Nummer 1, erforderlich.Die Konfiguration kann mehrere Optionen umfassen, wie zum Beispiel:
-
if
, das die öffentliche Schnittstelle spezifiziert, -
same_ports
, das sicherstellt, dass aliasierte Ports und lokale Portnummern gleich zugeordnet werden, -
unreg_only
, was dazu führt, dass nur nicht registrierte (private) Adressräume von der NAT-Instanz verarbeitet werden, -
reset
, das die NAT-Instanz betriebsbereit hält, selbst wenn sich die öffentliche IP-Adresse der IPFW-Maschine ändert.
Konsultieren Sie ipfw
für eine Liste aller Parameter, die für die Einrichtung einer einzelnen NAT-Instanz bereitgestellt werden können.Beim Entwerfen einer zustandsbehafteten NAT-Firewall ist es erforderlich, die Wiedereinfügung von übersetzten Paketen zur weiteren Verarbeitung zuzulassen.Dies ist möglich, indem das one_pass
-Verhalten zu Beginn des Firewall-Skripts deaktiviert wird.
ipfw disable one_pass
ipfw -q nat 1 config if $pif same_ports unreg_only reset
Die eingehende NAT-Regel wird nach den beiden Regeln platziert, die allen Verkehr auf den vertrauenswürdigen und Loopback-Schnittstellen erlauben, nach der Reassemble-Regel und vor der check-state
-Regel.Wichtig ist, dass die gewählte Regelnummer für diese NAT-Regel, in diesem Fall 100, höher als die vorherigen drei Regeln und niedriger als die check-state
-Regel sein muss.Darüber hinaus wird aufgrund des Verhaltens des In-Kernel-NAT empfohlen, eine Wiederherstellungsregel unmittelbar vor der ursprünglichen NAT-Regel und nach den Regeln, die den Verkehr auf der vertrauenswürdigen Schnittstelle erlauben, einzufügen.Beim Umgang mit IPSEC/ESP/GRE-Tunneling-Verkehr kann IP-Fragmentierung auftreten, was die Wiederzusammenführung der Teile vor der Übertragung des gesamten Pakets an die In-Kernel-NAT-Einrichtung erforderlich macht.
Die Reassemble-Regel war bei der Benutzerland-natd
nicht erforderlich, da die IPFW-Divert-Aktion Pakete bereits wieder zusammensetzt, bevor sie an den Socket übergeben werden.
Die im Beispiel verwendete NAT-Instanz und Regelnummer stimmen nicht mit denen überein, die von rc.firewal
l festgelegt wurden.rc.firewall
ist ein FreeBSD-Skript, das die Standard-Firewall-Regeln einrichtet.
$cmd 005 allow all from any to any via xl0 exclude LAN traffic
$cmd 010 allow all from any to any via lo0 exclude loopback traffic
$cmd 099 reass all from any to any in reassemble inbound packets
$cmd 100 nat 1 ip from any to any in via $pif NAT any inbound packets
#Allow the packet through if it has an existing entry in the dynamic rules table
$cmd 101 check-state
Ersetzen Sie die Erlauben-Aktion in den ausgehenden Regeln durch die $skip
-Variable, um anzuzeigen, dass die Regelverarbeitung bei Regel 1000 fortgesetzt wird.Die sieben TCP-Regeln wurden durch Regel 125 ersetzt, da die $good_tcpo
-Variable die sieben erlaubten ausgehenden Ports umfasst.
Denken Sie daran, dass die Leistung von IPFW hauptsächlich durch die Größe des Regelsets bestimmt wird.
#Authorized outbound packets
$cmd 120 $skip udp from any to x.x.x.x 53 out via $pif $ks
$cmd 121 $skip udp from any to x.x.x.x 67 out via $pif $ks
$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks
$cmd 130 $skip icmp from any to any out via $pif $ks
Außer der allerletzten Regel, die das Durchlassen über $pif
entfernt, um sowohl eingehende als auch ausgehende Regeln zu erfassen, bleiben die eingehenden Regeln unverändert.Die NAT-Regel muss nach der vorhergehenden ausgehenden Regel platziert werden, eine höhere Regelnummer haben, und die Regelnummer muss von der skipto
-Aktion referenziert werden.In diesem Regelwerk ist Regelnummer 1000 dafür verantwortlich, alle Pakete an die definierte NAT-Instanz zu senden.Die folgende Regel erlaubt, dass jedes Paket, das von NAT verarbeitet wurde, weitergeleitet wird.
$cmd 999 deny log all from any to any
$cmd 1000 nat 1 ip from any to any out via $pif skipto location for outbound stateful rules
$cmd 1001 allow ip from any to any
In diesem Beispiel regeln die Regeln 100, 101, 125, 1000 und 1001 die Adressübersetzung von ausgehenden und eingehenden Paketen, sodass die dynamischen Zustandsdatensatz-Einträge immer die private LANIP-Adresse aufzeichnen.
Betrachten Sie einen internen Webbrowser, der eine neue ausgehende HTTP-Verbindung auf Port 80 initiiert.Wenn das erste ausgehende Paket die Firewall erreicht, erfüllt es aufgrund seiner ausgehenden Richtung nicht die Regel 100.Regel 101 wird erfüllt, da dies das erste Paket ist und es noch nicht zur dynamischen Zustandsdatenbank hinzugefügt wurde.Das Paket erfüllt letztendlich Regel 125, da es ausgehende auf einem erlaubten Port ist und aus dem lokalen Netzwerk stammt.Wenn diese Regel erfüllt ist, treten zwei Aktionen ein.Zuerst fügt die keep-state-Aktion ein Element zur dynamischen Zustands-Tabelle hinzu, gefolgt von der Ausführung der bereitgestellten Aktion, skipto
Regel 1000.Das Paket durchläuft dann NAT, bevor es ins Internet geliefert wird.Dieses Paket wird an den Ziel-Webserver weitergeleitet, der ein Antwortpaket generiert und zurücksendet.Dieses neue Paket tritt an oberster Stelle in das Regelwerk ein.Es entspricht Regel 100 und seine Ziel-IP-Adresse wurde auf ihre ursprüngliche interne Adresse umgeleitet.Es wird anschließend von der Check-State-Regel verarbeitet, als bestehende Sitzung in der Datenbank identifiziert und ins LAN freigegeben.
Auf der eingehenden Seite muss das Regelwerk ungültige Pakete ablehnen und nur erlaubte Dienste zulassen.Wenn ein Paket eine eingehende Regel erfüllt, wird es der dynamischen Zustandstabelle hinzugefügt und an das LAN gesendet.Das Antwortpaket, das durch die Check-State-Regel erstellt wurde, wird als zu einer bestehenden Sitzung gehörend identifiziert.Das Paket wird anschließend zur Regel 1000 zur NAT-Verarbeitung gesendet, bevor es an die ausgehende Schnittstelle weitergeleitet wird.
Obwohl der Übergang von userland natd
zu in-kernel NAT reibungslos erscheinen mag, gibt es einen kleinen Haken.Während firewall_nat_enable
in /etc/rc.conf
gesetzt ist, wird IPFW das Kernel-Modul libalias.ko
beim Ausführen des GENERIC-Kernels laden.Das Kernel-Modul libalias.ko
bietet nur rudimentäre NAT-Funktionalitäten, aber die Userland-Implementierung natd
hat vollständige NAT-Funktionalitäten, die ohne weitere Einstellungen in seiner Userland-Bibliothek zugänglich sind.Alle Funktionen beziehen sich auf die folgenden Kernel-Module, die zusätzlich zum üblichen libalias.ko
Kernel-Modul mit der kld
-Listendirektive in /etc/rc.conf
geladen werden können: alias_ftp.ko
, alias_bbt.ko
, skinny.ko
, irc.ko
, alias_pptp.ko
und alias_smedia.ko
.Mit den LIBALIAS-Optionen kann die vollständige Funktionalität der Userland-Bibliothek in den Kernel integriert werden, wenn ein benutzerdefinierter Kernel verwendet wird.
Wie führt man Port-Weiterleitung durch?
Der Nachteil von NAT ist, dass LAN-Clients nicht vom Internet aus erreichbar sind.Clients im LAN können ausgehende Verbindungen zum Rest der Welt herstellen, aber sie können keine eingehenden Verbindungen akzeptieren.Dies ist ein Problem, wenn auf einem der LAN-Client-PCs Internetdienste versucht werden.Eine einfache Lösung besteht darin, bestimmte Internet-Ports auf dem NAT-Server an einen LAN-Client umzuleiten.
Zum Beispiel hostet Kunde A einen IRC-Server, während Kunde B einen Webserver hat.Damit dies korrekt funktioniert, müssen eingehende Verbindungen auf den Ports 6667 (IRC) und 80 (HTTP) an die entsprechenden Computer weitergeleitet werden.
Alle Einstellungen für das in-kernel NAT werden in der NAT-Instanzkonfiguration vorgenommen.Konsultieren Sie ipfw für eine vollständige Liste der Einstellungen, die eine In-Kernel-NAT-Instanz verwenden kann.Die Syntax von IPFW folgt der von natd.Die Syntax für redirect_port
ist unten angegeben:
redirect_port proto targetIP:targetPORT[-targetPORT]
[aliasIP:]aliasPORT[-aliasPORT]
[remoteIP[:remotePORT[-remotePORT]]]
Um das obige Beispiel-Setup zu konfigurieren, sollten die Argumente wie unten angegeben sein:
redirect_port tcp 192.168.0.2:6667 6667
redirect_port tcp 192.168.0.3:80 80
Nachdem diese Parameter zur Einrichtung von NAT-Instanz 1 im vorhergehenden Regelwerk hinzugefügt wurden, werden die TCP-Ports an die LAN-Client-PCs weitergeleitet, die IRC und HTTP ausführen.
ipfw -q nat 1 config if $pif same_ports unreg_only reset \
redirect_port tcp 192.168.0.2:6667 6667 \
redirect_port tcp 192.168.0.3:80 80
Mit redirect_port können Portbereiche über einzelne Ports angegeben werden.Zum Beispiel tcp 192.168.0.2:2000-3000
.Alle Verbindungen, die auf den Ports 2000 bis 3000 empfangen werden, würden an die Ports 2000 bis 3000 von Client A weitergeleitet.
Wie implementiert man Adressumleitung?
Adressweiterleitung ist vorteilhaft, wenn viele IP-Adressen verfügbar sind.Jeder LAN-Client kann mit ipfw eine eigene externe IP-Adresse zugewiesen bekommen, die dann ausgehende Pakete mit der richtigen externen IP-Adresse umschreibt und den gesamten eingehenden Verkehr auf diese IP-Adresse an den entsprechenden LAN-Client weiterleitet.Auch bekannt als statisches NAT.Wenn die IP-Adressen 12.0.0.1, 12.0.0.2 und 12.0.0.3 verfügbar sind, kann beispielsweise 12.0.0.1 als externe IP-Adresse der ipfw-Maschine verwendet werden, während 12.0.0.2 und 12.0.0.3 an die LAN-Clients A und B weitergeleitet werden.
Das Format für redirect_addr
ist wie folgt, wobei localIP die interne IP-Adresse des LAN-Clients und publicIP die externe IP-Adresse ist.
redirect_addr localIP publicIP
Im Beispiel wären dies die Argumente:
redirect_addr 192.168.0.2 12.0.0.2
redirect_addr 192.168.0.3 12.0.0.3
Wie redirect_addr
werden diese Parameter in die Konfiguration einer NAT-Instanz eingefügt.Mit der Adressumleitung ist eine Portumleitung nicht notwendig, da alle Daten, die an eine bestimmte IP-Adresse gesendet werden, umgeleitet werden.
Externe IP-Adressen müssen aktiv sein und der externen Schnittstelle auf dem ipfw-Host zugewiesen werden.
Wie implementiert man Userspace NAT?
Die Userspace-NAT-Implementierung, natd
, hat mehr Overhead als das In-Kernel-NAT.Damit natd
Pakete übersetzen kann, müssen die Pakete vom Kernel in den Benutzerspeicher und zurück übertragen werden, was im Vergleich zu in-kernel NAT zusätzliche Kosten verursacht.
Die minimale Konfiguration zum Aktivieren des Userspace-NAT-Daemons natd
beim Booten ist wie folgt in /etc/rc.conf
.Dabei wird natd_interface
auf den Namen der mit dem Internet verbundenen Netzwerkkarte (NIC) gesetzt.Das rc
-Skript von natd
wird automatisch auf das Vorhandensein einer dynamischen IP-Adresse überprüfen und sich entsprechend anpassen, wenn eine erkannt wird.
gateway_enable="YES"
natd_enable="YES"
natd_interface="rl0"
Im Allgemeinen kann das oben beschriebene Regelwerk für In-Kernel-NAT auch mit natd
verwendet werden.Ausnahmen umfassen die Einstellung der In-Kernel-NAT-Instanz (ipfw -q nat 1 config ...
), die in Verbindung mit der Reassemble-Regel 99 nicht erforderlich ist, da ihre Funktionalität in die Divert-Aktion integriert ist.Die Regelnummern 100 und 1000 benötigen geringfügige Änderungen, wie unten detailliert beschrieben:
$cmd 100 divert natd ip from any to any in via $pif
$cmd 1000 divert natd ip from any to any out via $pif
Um die Port- oder Adressumleitung einzurichten, wird dieselbe Syntax wie beim In-Kernel-NAT verwendet.Dennoch sollte im Gegensatz zum In-Kernel-NAT die Einstellung von natd
jetzt in einer Konfigurationsdatei anstelle des Regelsets-Skripts angegeben werden.Dies erfordert das Übergeben eines zusätzlichen Flags durch /etc/rc.conf
, das den Speicherort der Konfigurationsdatei angibt.
natd_flags="-f /etc/natd.conf"
ist ein Flag, das den Speicherort der natd
-Konfigurationsdatei angibt.
Die bereitgestellte Datei muss eine zeilenweise Liste der Konfigurationseinstellungen enthalten.Zwei Beispiele sind unten aufgeführt, jeweils eine pro Zeile:
redirect_port tcp 192.168.0.2:6667 6667
redirect_addr 192.168.0.3 12.0.0.3
Wie verwendet man den ipfw-Befehl?
ipfw
kann verwendet werden, um manuell eine einzelne Regel aus der aktiven Firewall hinzuzufügen oder zu entfernen, während sie in Betrieb ist.Das Problem mit dieser Technik ist, dass alle Änderungen nach einem Neustart des Systems verloren gehen.Anstatt alle Regeln in einer einzigen Datei zu speichern, wird empfohlen, diese Datei zu nutzen, um die Regeln beim Booten zu laden und die derzeit laufenden Firewall-Regeln jedes Mal zu ersetzen, wenn diese Datei geändert wird.
ipfw
ist eine effiziente Methode, um die aktiven Firewall-Regeln auf dem Konsolenbildschirm anzuzeigen.Die IPFW-Abrechnungsfunktion erzeugt einen dynamischen Zähler für jede Regel, der die Anzahl der Pakete zählt, die der Regel entsprechen.Im Prozess des Testens einer Regel ist das Auflisten der Regel mit ihrem Zähler eine Methode, um festzustellen, ob die Regel wie geplant funktioniert.
-
Um alle laufenden IPFW-Regeln der Reihe nach aufzulisten, können Sie den folgenden Befehl ausführen:
ipfw list
-
Um alle aktiven IPFW-Regeln mit Datum und Uhrzeit des letzten Übereinstimmens der Regel anzuzeigen, können Sie den folgenden Befehl ausführen
ipfw -t record
-
Zusammen mit den Regeln selbst liefert das folgende Beispiel Buchhaltungsinformationen und die Anzahl der Pakete für die übereinstimmenden Regeln. Die erste Spalte enthält die Regelnummer, dann die Gesamtzahl der übereinstimmenden Pakete und Bytes und schließlich die Regel selbst.
ipfw list -a
-
Um dynamische IPFW-Regeln zusammen mit statischen Regeln einzufügen, führen Sie den nächsten Befehl aus:
ipfw -d list
-
Um abgelaufene dynamische IPFW-Regeln anzuzeigen, können Sie den folgenden Befehl ausführen:
ipfw -d -e list
-
Um die Zähler auf null zurückzusetzen, führen Sie den nächsten Befehl aus:
ipfw zero
-
Um die Zähler für die IPFW-Regel mit der Nummer NUM zurückzusetzen, können Sie den folgenden Befehl ausführen:
ipfw zero NUM
Wie man mit dem Protokollieren von Firewall-Nachrichten beginnt?
Selbst mit aktivierter Protokollierungsfunktion wird IPFW keine Regelprotokollierung automatisch erzeugen.Der Administrator der Firewall bestimmt, welche Regeln im Regelset aufgezeichnet werden sollen, und fügt diesen Regeln das Schlüsselwort "log" hinzu.Typischerweise werden nur Regelverweigerungen dokumentiert.Gewöhnlich wird die Regel "ipfw default deny everything" mit dem hinzugefügten Schlüsselwort log als letzte Regel im Regelwerk dupliziert.So ist es möglich, alle Pakete zu sehen, die keines der Kriterien des Regelsets erfüllt haben.
Das Protokollieren hat sowohl Vor- als auch Nachteile.Eine Überfülle an Protokolldaten oder ein DoS-Angriff könnte die Festplatte mit Protokolldateien belasten, wenn keine Vorsichtsmaßnahmen getroffen werden.Nicht nur werden Protokollnachrichten an syslogd gesendet, sondern sie werden auch auf dem Root-Konsole-Bildschirm angezeigt, was schnell unangenehm wird.
Der Kernel-Parameter IPFIREWALL_VERBOSE_LIMIT=5
beschränkt die Anzahl aufeinanderfolgender Nachrichten, die an syslogd über Pakete gesendet werden, die einem bestimmten Kriterium entsprechen.Wenn diese Option im Kernel aktiviert ist, wird die maximale Anzahl aufeinanderfolgender Nachrichten für eine bestimmte Regel auf den angegebenen Wert begrenzt.Es gibt keinen Nutzen darin, 200 identische Protokollnachrichten zu erhalten.Mit dieser Option auf fünf gesetzt, würden fünf aufeinanderfolgende Nachrichten, die sich auf eine bestimmte Regel beziehen, in syslogd aufgezeichnet, und die verbleibenden identischen aufeinanderfolgenden Nachrichten würden gezählt und mit einer ähnlichen Aussage wie der untenstehenden an syslogd hochgeladen:
last message repeated 94 times
Standardmäßig werden alle Paketnachrichten in /var/log/security
geschrieben, wie in /etc/syslog.conf
angegeben.
Wie erstelle ich ein IPFW-Regelskript?
Die Mehrheit der erfahrenen IPFW-Nutzer erstellt eine Datei, die die Regeln enthält, und kodiert sie so, dass sie als Skript ausgeführt werden können.Der Hauptvorteil dieser Methode besteht darin, dass die Firewall-Regeln in großen Mengen aktualisiert werden, ohne dass ein Systemneustart erforderlich ist.Dieser Ansatz ist nützlich, um neue Regeln zu testen, da der Prozess so oft wie nötig durchgeführt wird.Als Skript wird die symbolische Substitution verwendet, um häufig verwendete Werte in mehrere Regeln einzufügen.
Dieses Beispielskript ist mit der Syntax der sh
, csh
und tcsh
Shells kompatibel.Das Dollarzeichen ($
) steht vor symbolischen Ersetzungsfeldern.Symbolische Felder werden nicht mit $
vorangestellt.Der Wert, der verwendet wird, um das symbolische Feld auszufüllen, muss von doppelten Anführungszeichen (""
) umgeben sein.
Sie können Ihre IPFW-Regeldatei wie unten angegeben starten:
# start of example ipfw rules script
ipfw -q -f flush # Delete all rules
# Set defaults
oif="vtnet0" #out interface
odns="192.0.0.1" #ISP's DNS server IP address
cmd="ipfw -q add " #build rule prefix
ks="keep-state" #just too lazy to key this each time
$cmd 00500 check-state
$cmd 00502 deny all from any to any frag
$cmd 00501 deny tcp from any to any established
$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks
$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks
$cmd 00611 allow udp from any to $odns 53 out via $oif $ks
#End of example ipfw rules script
Der Schwerpunkt dieses Beispiels liegt darauf, wie die symbolischen Ersetzungsfelder ausgefüllt werden, nicht auf den Regeln.
Wenn das obige Beispiel in /etc/ipfw.rules
gespeichert wäre, könnte der folgende Befehl verwendet werden, um die Regeln neu zu laden:
sh /etc/ipfw.rules
/etc/ipfw.rules
kann überall platziert werden und kann jeden Namen haben.
Das gleiche Ergebnis könnte durch manuelles Ausführen dieser Befehle erreicht werden:
ipfw -q -f flush
ipfw -q add check-state
ipfw -q add deny all from any to any frag
ipfw -q add deny tcp from any to any established
ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state
ipfw -q add allow tcp from any to 192.0.0.01 53 out via tun0 setup keep-state
ipfw -q add 00611 allow udp from any to 192.0.0.1 53 out via tun0 keep-state
Was sind die IPFW-Regelsatzbeispiele für eine Workstation?
Ein Beispiel für ein IPFW-Regelsatz, den Sie zum Schutz Ihrer FreeBSD-Workstation verwenden können, ist unten angegeben:
################ Start of IPFW rules file ###############################
#!/bin/sh
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
net="em0" # interface name of NIC attached to Internet
#################################################################
# No restrictions on the Loopback Interface
#################################################################
$cmd 00005 allow ip from any to any via lo0
#################################################################
# Permit the packet to pass if it has been previously added to the "dynamic" rules table by a "allow keep-state" declaration.
#################################################################
$cmd 00010 check-state :default
#################################################################
# Interface facing Public Internet (Outbound Section)
#Examine session start requests coming from behind the firewall on the private network or this gateway server bound for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# x.x.x.x must be the IP address of your ISP.s DNS
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
$cmd 00020 allow tcp from any to 192.168.1.1 53 out via $net setup keep-state
$cmd 00025 allow udp from any to 192.168.1.1 53 out via $net keep-state
# Allow out non-secure standard www function
$cmd 00030 allow tcp from any to any 80 out via $net setup keep-state
# Allow out secure www function https over TLS SSL
$cmd 00035 allow tcp from any to any 443 out via $net setup keep-state
# Allow out send and get email function (SMTP/POP3)
$cmd 00040 allow tcp from any to any 25 out via $net setup keep-state
$cmd 00041 allow tcp from any to any 110 out via $net setup keep-state
# Allow outbound ping
$cmd 00050 allow icmp from any to any out via $net keep-state
# Allow outbound SSH
$cmd 00060 allow tcp from any to any 22 out via $net setup keep-state
# Allow out whois
$cmd 00090 allow tcp from any to any 43 out via $net setup keep-state
# Deny and log everything else that is trying to get out.
# This rule enforces the block all by default logic.
$cmd 00099 deny log all from any to any out via $net
#################################################################
# Interface facing Public Internet (Inbound Section)
# Examine packets from the public Internet that are headed for this gateway server or the private network.
#################################################################
# Deny all inbound traffic from non-routable reserved address spaces
# $cmd 00300 deny all from 192.168.0.0/16 to any in via $net #RFC 1918 private IP
$cmd 00301 deny all from 172.16.0.0/12 to any in via $net #RFC 1918 private IP
$cmd 00302 deny all from 10.0.0.0/8 to any in via $net #RFC 1918 private IP
$cmd 00303 deny all from 127.0.0.0/8 to any in via $net #loopback
$cmd 00304 deny all from 0.0.0.0/8 to any in via $net #loopback
$cmd 00305 deny all from 169.254.0.0/16 to any in via $net #DHCP auto-config
$cmd 00306 deny all from 192.0.2.0/24 to any in via $net #reserved for docs
$cmd 00308 deny all from 224.0.0.0/3 to any in via $net #Class D & E multicast
$cmd 00309 deny all from any to ::1 in via $net
$cmd 00310 deny all from ::1 to any in via $net
# Deny public pings
$cmd 00320 deny icmp from any to any in via $net
# Deny ident
$cmd 00330 deny tcp from any to any 113 in via $pif
# Deny all Netbios services. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 81
$cmd 00340 deny tcp from any to any 137 in via $net
$cmd 00341 deny tcp from any to any 138 in via $net
$cmd 00342 deny tcp from any to any 139 in via $net
$cmd 00343 deny tcp from any to any 81 in via $net
# Deny any late arriving packets
$cmd 00340 deny all from any to any frag in via $net
# Deny ACK packets that did not match the dynamic rule table
$cmd 00345 deny tcp from any to any established in via $net
# Allow in standard www function because we have a web server
$cmd 00400 allow tcp from any to me 80 in via $net setup limit src-addr 2
$cmd 00401 allow tcp from any to me 443 in via $net setup limit src-addr 2
# Allow inbound SSH
# Rather than setting 'any', you should designate which IPs or IP groups may access the network.
$cmd 00450 allow tcp from any to me 22 in via $net setup keep-state
# Reject & Log all incoming connections from the outside
$cmd 00499 deny log all from any to any in via $net
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 00999 deny log all from any to any
################ End of IPFW rules file ###############################
Diese Einstellung erlaubt den Datenverkehr vom 192.168.0.0-Subnetz, da sich in diesem Netzwerk viele Heimgeräte befinden werden.Und dies ist erforderlich, damit die Dienste funktionieren.Die Einstellungen können wie folgt geändert werden, wenn man alle LAN-Kommunikation, einschließlich von dem "vertrauenswürdigen" lokalen Netzwerk, verbieten möchte, um zu verhindern, dass kompromittierte Arbeitsstationen ihre schädlichen Payloads so leicht verbreiten.
Für Sperrregeln entfernen Sie die Anweisung aus dem 00300-Regelsatz:
$cmd 00300 deny all from 192.168.0.0/16 to any in via $net #RFC 1918 private IP
$cmd 00301 deny all from 172.16.0.0/12 to any in via $net #RFC 1918 private IP
Und wenn Dienste wie SSH von einer bestimmten IP-Adresse benötigt werden, kann eine Regel direkt über der Sperrregel hinzugefügt werden.Denken Sie daran, dass IPFW dem Prinzip 'first match wins' folgt, daher ist die erste Regel, die übereinstimmt, diejenige, die angewendet wird.Daher müssen wir SSH von der angegebenen IP zulassen, bevor wir alle sperren.
# Allow inbound SSH
$cmd 00250 allow tcp from 192.168.1.100 to me 22 in via $net setup keep-state
Zusätzliche Dienstleistungen, die für die Nutzung erforderlich sind, wie:
# Allow in standard www function because I have an Apache HTTP server
$cmd 00260 allow tcp from any to me 80 in via $net setup limit src-addr 2
$cmd 00265 allow tcp from any to me 443 in via $net setup limit src-addr 2
Ping kann auch als eingehende Pakete hinzugefügt werden.
# Allow public pings
$cmd 00270 allow icmp from any to any in via $net limit src-addr 2
Diese Modifikationen sind vorteilhaft, wenn das LAN nicht vertrauenswürdig ist.Je nach Umgebung, Anforderungen und persönlichen Vorlieben des Netzwerk- oder Systemadministrators kann dies übertrieben sein, wenn der FreeBSD-Server in einem Büro steht.Dies kann jedoch für Laptops erforderlich sein, die in Cafés, in unzuverlässigen Kundennetzwerken und dergleichen verwendet werden.Da UNIX Änderungen durch das Bearbeiten von Textdateien schnell umsetzen lässt, könnten Sie sich gezwungen fühlen, an den Inhalten Ihrer Website zu arbeiten, während Sie mit einem dieser unzuverlässigen Netzwerke verbunden sind.Sie können die folgenden Regeln ändern, um den Zugriff nur auf das Material zu beschränken, das von Ihrem lokalen Apache HTTP-Server bereitgestellt wird.
# Allow in standard www function because I have an Apache HTTP server
$cmd 00260 allow tcp from me to me 80 in via $net setup limit src-addr 1
$cmd 00265 allow tcp from me to me 443 in via $net setup limit src-addr 1
Das Hinzufügen dieser Regeländerungen ist notwendig, aber Sie müssen auch die vorherigen löschen, wie 00400, 00401 und 00450, damit nur die IP-Adressen, die in den neu geänderten Regeln aufgeführt sind, Zugang erhalten und der Rest gesperrt wird.
Was sind die IPFW-Regelsatzbeispiele für einen Webserver?
Ein Beispiel für ein IPFW-Regelsatz, den Sie zum Schutz Ihres FreeBSD-Webservers verwenden können, ist unten angegeben:
################### Web Server Example ##################################
#!/bin/sh
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
net="vtnet0" # interface name of NIC attached to Internet
#################################################################
# No restrictions on the Loopback Interface
#################################################################
$cmd 00005 allow ip from any to any via lo0
#################################################################
# Allow the packet through if it has previously been added to the
# the "dynamic" rules table by an allow keep-state statement.
#################################################################
$cmd 00010 check-state :default
#################################################################
# Interface facing Public Internet (Outbound Section)
#Examine session start requests coming from behind the firewall on the private network or this gateway server bound for the public Internet.
#################################################################
# Allow out non-secure standard www function
$cmd 00030 allow tcp from me to any 80 out via $net setup keep-state
# Allow out secure www function https over TLS SSL
$cmd 00035 allow tcp from me to any 443 out via $net setup keep-state
# Allow out send and get email function
# Uncomment if you need to use these ports to send email from Webserver
# $cmd 00040 allow tcp from me to any 25 out via $net setup keep-state
# $cmd 00041 allow tcp from me to any 110 out via $net setup keep-state
# Allow outbound ping
$cmd 00050 allow icmp from any to any out via $net keep-state
# Allow outbound SSH
# Uncomment this rule if you need to access other servers from this one
# $cmd 00060 allow tcp from any to any 22 out via $net setup keep-state
# Deny and log everything else that is trying to get out.
# This rule enforces the block all by default logic.
$cmd 00099 deny log all from any to any out via $net
#################################################################
# Interface facing Public Internet (Inbound Section)
# Examine packets from the public Internet that are headed for this gateway server or the private network.
#################################################################
# Deny all inbound traffic from non-routable reserved address spaces
$cmd 00300 deny all from 192.168.0.0/16 to any in via $net #RFC 1918 private IP
$cmd 00301 deny all from 172.16.0.0/12 to any in via $net #RFC 1918 private IP
$cmd 00302 deny all from 10.0.0.0/8 to any in via $net #RFC 1918 private IP
$cmd 00303 deny all from 127.0.0.0/8 to any in via $net #loopback
$cmd 00304 deny all from 0.0.0.0/8 to any in via $net #loopback
$cmd 00305 deny all from 169.254.0.0/16 to any in via $net #DHCP auto-config
$cmd 00306 deny all from 192.0.2.0/24 to any in via $net #reserved for docs
$cmd 00307 deny all from 204.152.64.0/23 to any in via $net #Sun cluster interconnect
$cmd 00308 deny all from 224.0.0.0/3 to any in via $net #Class D & E multicast
$cmd 00309 deny all from any to ::1 in via $net
$cmd 00310 deny all from ::1 to any in via $net
# Deny any late arriving packets
$cmd 00320 deny all from any to any frag in via $net
# Deny ACK packets that did not match the dynamic rule table
$cmd 00325 deny tcp from any to any established in via $net
# Allow in HTTP and HTTPS connections
$cmd 00330 allow tcp from any to me 80 in via $net setup limit src-addr 2
$cmd 00331 allow tcp from any to me 443 in via $net setup limit src-addr 2
# Deny ident
$cmd 00340 deny tcp from any to any 113 in via $pif
# Deny all Netbios services. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 81
$cmd 00350 deny tcp from any to any 137 in via $net
$cmd 00351 deny tcp from any to any 138 in via $net
$cmd 00352 deny tcp from any to any 139 in via $net
$cmd 00353 deny tcp from any to any 81 in via $net
# Allow inbound SSH
# Rather than setting 'any', you should designate which IPs or IP groups may access the network.
$cmd 00400 allow tcp from any to me 22 in via $net setup keep-state
# Deny public pings
# Uncomment the rule to deny pings from anywhere
# $cmd 00410 deny icmp from any to any in via $net
# Allow public pings from one source
$cmd 00415 allow icmp from any to any in via $net limit src-addr 1
# Reject & Log all incoming connections from the outside
$cmd 00499 deny log all from any to any in via $net
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 00999 deny log all from any to any
################ End of IPFW rules file ###############################
Was sind die IPFW-Regelsatzbeispiele für ein Gateway?
Dies ist ein ipfw-Konfigurationsversuch für einen Cluster mit einem Master-Knoten und vielen Rechenknoten.Der Master-Knoten dient als Gateway für die Anzahl der Rechenknoten im lokalen Netzwerk (192.168.0.0/24).
Ein Jail, das auf einem der Compute-Knoten mit der Adresse 192.168.0.10 ausgeführt wird, muss von außen zugänglich sein (unter Verwendung von redirect_addr 192.168.0.10 22.22.33.33
).Die IP-Adresse 22.22.33.33 ist ein Alias für die WAN-Schnittstelle und wird verwendet, um den Verkehr zu diesem Gefängnis umzuleiten.
Der eingehende Verkehr auf Port 2222 sollte an Port 22 auf dem Rechenknoten 192.168.0.100 weitergeleitet werden.
Weder der Master-Knoten noch die Compute-Knoten sollten ausgehenden Datenverkehr blockieren.
Stellen Sie sicher, dass der Wert von net.inet.ip.fw.one_pass
0
ist.
cmd="/sbin/ipfw -q"
lanif="vtnet0"
wanif="vtnet1"
# flush existing rules
$cmd -f flush
# incoming nat
$cmd nat 1 config if $wanif \
reset \
same_ports \
unreg_only \
redirect_port tcp 192.168.0.100:22 2222 \
redirect_addr 192.168.0.10 22.22.33.33
# set up loopback
$cmd add allow all from any to any via lo0
$cmd add deny all from any to 127.0.0.0/8
$cmd add deny ip from 127.0.0.0/8 to any
# no restrictions on bridge0 or tun0
$cmd add allow all from any to any via bridge0
$cmd add allow all from any to any via tun0
# no restrictions on lanif
$cmd add allow all from any to any via $lanif
# catch spoofing from outside
$cmd add deny ip from any to any in not antispoof
# incoming traffic that needs nat
$cmd add nat 1 ip4 from any to me in recv $wanif
# this rule must be directly after incoming nat
$cmd add check-state
# outgoing traffic to block here
# allow all other outgoing connections by bypassing the outbound nat rule processing. 10000
$cmd add skipto 10000 tcp from any to any out xmit $wanif setup keep-state
$cmd add skipto 10000 udp from any to any out xmit $wanif keep-state
# incoming
$cmd add allow tcp from any to me 80,443,2222 in recv $wanif setup keep-state
# Rules that let packets to reach services listening on a LAN interface behind the NAT.
$cmd add skipto 10000 tcp from any to any 2222 in recv $wanif setup keep-state
# nat for outgoing packets
$cmd add 10000 nat 1 ip4 from any to any out xmit $wanif
#$cmd add 10000 nat 1 ip4 from 192.168.0.0/24 to any out
# allow anything else
$cmd add allow ip from any to any via $wanif
Was sind die IPFW-Kernel-Optionen?
IPFW kann als Kernel-Modul installiert werden; die folgenden Einstellungen werden standardmäßig als Module erstellt oder können dynamisch mit Tunables geändert werden.Siehe Konfigurieren des FreeBSD-Kernels für Informationen zum statischen Kompilieren der IPFW-Funktionalität in einen benutzerdefinierten Kernel.Für die Konfigurationsdatei des benutzerdefinierten Kernels stehen die folgenden Optionen zur Verfügung:
options IPFIREWALL # enables IPFW
options IPFIREWALL_VERBOSE # enables logging for rules with log keyword to syslogd(8)
options IPFIREWALL_VERBOSE_LIMIT=5 # limits number of logged packets per-entry
options IPFIREWALL_DEFAULT_TO_ACCEPT # sets default policy to pass what is not explicitly denied
options IPFIREWALL_NAT # enables basic in-kernel NAT support
options LIBALIAS # enables full in-kernel NAT support
options IPFIREWALL_NAT64 # enables in-kernel NAT64 support
options IPFIREWALL_NPTV6 # enables in-kernel IPv6 NPT support
options IPFIREWALL_PMOD # enables protocols modification module support
options IPDIVERT # enables NAT through natd(8)