Firewalls mit FreeBSD und Linux Johannes Hofmeister © 2008, http://cessor.de/ Beschreibung Das folgende Dokument beschreibt das aufsetzen mehrerer Firewall Lösungen auf der Basis von FreeBSD. FreeBSD ist ein quelloffenes Betriebssystem und kann unter http://www.freebsd.org heruntergeladen werden. Dieses Dokument kann unter http://cessor.de/misc/fw/Firewall.docx (Word 2007) http://cessor.de/misc/fw/Firewall.doc (Word 2003) http://cessor.de/misc/fw/Firewall.pdf (PDF) herunter geladen werden. Die erstellten Konfigurationsdateien sind zu finden unter: http://cessor.de/misc/fw/ Inhalt Beschreibung ........................................................................................................................................... 1 Allgemeines ............................................................................................................................................. 3 Client Firewall ...................................................................................................................................... 3 Echte Firewall ...................................................................................................................................... 3 Technik ................................................................................................................................................ 3 Netzwerktopologie .................................................................................................................................. 4 Konfiguration des Gateways ................................................................................................................... 4 IPFIREWALL (IPFW) .................................................................................................................................. 7 Regel Syntax ........................................................................................................................................ 8 Scripting ............................................................................................................................................. 10 IPFILTER (IPF) ......................................................................................................................................... 13 Verwenden von ipf ............................................................................................................................ 13 Regel Syntax ...................................................................................................................................... 14 NAT mit IPF .................................................................................................................................... 15 IPF Firewall Script .......................................................................................................................... 16 IPNAT Network Address Translation Script ................................................................................... 17 Packet Filter (PF).................................................................................................................................... 18 Verwendung ...................................................................................................................................... 18 Regel Syntax ...................................................................................................................................... 18 Ausblick ................................................................................................................................................. 21 Traffic Shaping ................................................................................................................................... 21 Bridging.............................................................................................................................................. 21 Kernel Compilierung .......................................................................................................................... 21 Anhang .................................................................................................................................................. 22 Quellen .............................................................................................................................................. 22 Verwendete Programme ................................................................................................................... 22 Downloads ......................................................................................................................................... 22 Allgemeines Allgemeines Vertrauen in die Motive von Datenpaketen ist grundsätzlich falsch – es existiert eine Vielzahl böswilliger Benutzer und automatischer Programme wie Viren und Trojaner. Ein Virenscanner selbst reinigt Rechner nur von laufenden Prozessen, um bestimmte Daten von vorneherein nicht anzunehmen benötigt man eine Firewall. Diese filtert den Netzwerkverkehr. Client Firewall Clientfirewalls oder auch Personal Firewalls sind keine richtigen Firewalls. Meist werden diese als sog. Firewalls verkauft, aber sie entsprechen nicht dem Konzept einer richtigen Firewall. Diese Firewalls sind meist in der Lage bestimmte Ports und Verbindungen zu überprüfen, bieten aber nicht die echte Sicherheit einer Firewall. Sie dienen meist nur dem Ausgleich von Fehlern im Betriebssystem und finden meist nur auf Windowsbasierten Rechnern Anwendung. Dennoch sind Clientfirewalls nützlich, da diese meist im Paket mit einem Viren- und Malwarescanner angeboten werden. Sie bieten dadurch zumindest rudimentäre Sicherungsmechanismen des Systems, welche aber für erfahrene Benutzer meist obsolet sind. Echte Firewall Eine echte Firewall bietet eine Vielzahl von Vorteilen gegenüber der Clientfirewall. Echte Firewalls werden auf einem dedizierten Host im Netz installiert, dadurch spart sich der eigentliche Client im Netz, der geschützt werden soll, Rechenleistung gegenüber der Clientfirewall. Die Firewall ist in der Lage weitere Schutzmechanismen aufzubauen. So ist ein Rechner mit einer Clientfirewall im Netz sichtbar und damit verwundbar, eine dedizierte Firewall ist im Netz selbst unsichtbar und kann auch die Hosts die sie schützt verstecken. Technik Firewalls kontrollieren den Netzwerkverkehr mit Hilfe von bestimmten Listen, die Regeln für zuzulassenden oder für zu verweigernde Verbindungen enthalten. Diese Listen können inklusive oder exklusive sein. Exklusive Listen erlauben zunächst alles und enthalten dann eine Liste mit gesperrten Verbindungen. Dieses Verfahren nennt man auch Black List. Inklusive Firewalls verwenden hingegen eine White List. Diese verweigert jeglichen Verkehr, der nicht explizit erlaubt wurde. Inklusive Firewalls sind wesentlich sicherer als exklusive Firewalls. Die Interpretation der Regeln geschieht meist in OSI Layer 3 und 4, also Network und Transport Layer. Die Regeln beinhalten daher meist angaben über das Protokoll, bzw. einen bestimmten Port (TCP, UPD, etc) oder ip Adressen. Die Regellisten können unterschiedlich implementiert werden, FIRST MATCH WINS und LAST MATCH WINS. Mit FIRST MATCH endet die Auswertung der Regeln, sobald eine Regel zutrifft. LAST MATCH wertet alle Regeln aus. Treffen mehrere Regeln zu, so wird die letzte verwendet. Firewalls können so eingestellt werden, dass sie die Verbindungen dauerhaft verwalten. Wird eine Anfrage von einem Host hinter der Firewall gestellt, so kann der antwortende Host (beispielsweise der Server) nur mit einem Packet des selben Typs antworten. Dadurch wird die Firewall zwar potentiell verwundbar gegen DDoS Attacken, daher wird sie meist mit einem hybriden Verhalten, also teils stateful und teils stateles implementiert. Im Folgenden sollen die Implementierungen Firewalls auf der Basis von BSD und Linux Systemen erklärt werden. Unter Linux steht die Software „iptables“ unter FreeBSD „ipfw“ und „ipf“ zur Verfügung. Netzwerktopologie Um die Firewall sinnvoll zu implementieren wird die folgende Topologie verwendet: Der Zugriff über das Internet geschieht über einen Router. Dieser hat die lokale IP Adresse 192.168.1.1. Direkt am Router angeschlossen ist der Firewall Rechner. Dieser fungiert als Gateway und besitzt zwei Netzwerkinterfaces. Das an den Router angeschlossene Interface hat die IP Adresse 192.168.1.3, das Interface am Client Netz hat die Adresse 192.168.2.1. Es befinden sich also zwei Netze in der aktuellen Topologie, x.x.2.0 und x.x.1.0. Die Host befinden sich alle im Netz 192.168.2.0. Konfiguration des Gateways Der Rechner besitzt zwei Interfaces. Eine interne Netzwerkkarte des nForce Mainboard Chipsatzes. Treiber ist nfe, daher heisst das Interface nfe0. Das interface rl0 hingegen ist an einen PCI Slot angeschlossen und benutzt einen Realtek Chipsatz. Die Interfaces werden mit dem Tool ifconfig konfiguriert: ifconfig ifconfig ifconfig ifconfig nfe0 inet 192.168.1.3 netmask 255.255.255.0 rl0 inet 192.168.2.1 netmask 255.255.255.0 nfe0 up rl0 up Die Korrektheit der einstellungen kann über eine Ping abfrage geprüft werden. ping 192.168.2.1 ping 192.168.1.3 Um die Einstellungen zu persistieren müssen sie in der Datei /etc/rc.conf Festgeschrieben werden. Um für ein Interface DHCP zu aktivieren verwendet man den Eintrag: ifconfig_nfe0=“DHCP“ Diese Konfiguration trifft aber nicht auf den aktuellen Fall zu, daher werden stattdessen die folgenden Einträge verwendet: ifconfig_nfe0=“inet 192.168.1.3 netmask 255.255.255.0“ ifconfig_nfe0=“inet 192.168.1.3 netmask 255.255.255.0“ Danach wird der Rechner als Gateway konfiguriert. Dazu wird der folgende Eintrag in der Datei /etc/rc.conf vorgenommen: gateway_enable=“YES“ Dieser Eintrag kann auch über das Tool Sysctl vorgenommen werden. sysctl –a Zeigt diverse Kerneleinstellungen an. Über das Tool können diese Einstellungen verändert werden: sysctl sysctl sysctl net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1 net.inet.ip.fastforwarding=1 Das erste Kommando hat den selben Effekt wie gateway_enable =”YES”. Danach wird die defaultroute auf den Internet Router gesetzt: defaultrouter=“192.168.1.1“ Der Befehl netstat –r zeigt alle verfügbaren Routen an. Diese können die folgenden Flags aufweisen: Flags: Flag U H G S C W L Bedeutung Up: Route ist aktiv Route zu einem konkreten Host Route zum Gateway Statische Route Clone: Route wurde geklont Route ist bereits geklont worden Link Route Mit diesen Einstellungen gelangen Pakete aus dem x.2.0 Netz bereits ins x.1.0 Netz, jedoch nicht zurück. Pingsignale schlagen daher fehl (genau wie jeder andere Verkehr). Damit Pakete aus dem x.1.0er Netz wieder zurück ins x.2.0 er Netz gelangen können muss der Router mit der IP 192.168.1.1 eine Route ins Netz 2.0 kennen, welche über das Interface nfe0 ( 192.168.1.3) am BSD Gateway führt. Dadurch wären jedoch Hosts nach außen hin sichtbar, was keineswegs erwünscht ist. Daher werden die Hosts hinter dem Gateway mit Network Address Translation versteckt. Dadurch senden die Hosts dem Gateway Anfragen an beliebige Adressen (beispielsweise im Internet). Diese werden vom GW an den Router weitergeleitet, erhalten jedoch als Source IP die Adresse des Gateways. Der Router bearbeitet die Pakete dann für den Gateway und sendet ihm diese zurück. Der Gateway verteilt diese wiederum an die entsprechenden Hosts im x.2.0er Netz. firewall_enable=”YES” firewall_type=”OPEN” natd_enable=”YES” natd_interface=”nfe0” natd_flags=”-f /etc/natd.conf” Zunächst wird die Firewall aktiviert. Die og. Eintragung führt dazu, dass die in der Datei /etc/rc.firewall spezifizierten Regeln verwendet werden, um Pakete zu filtern. Der zweite Eintrag verwendet ein allgemeines Regelwerk, welches alle Pakete durchlässt. Danach wird der NAT Daemon natd aktiviert. Alle ausgehenden Pakete zum Internet sollen mit NAT gekapselt werden, also muss als Interface das zum Router zeigende angegeben werden (nfe0). Um weitere Konfigurationen festzulegen wird eine Konfigurationsdatei in den Bootflags von natd angegeben. In dieser können weiter NAT Regeln eingetragen werden wie beispielsweise für Port Forwarding… IPFIREWALL (IPFW) IPFW ist das Standardpaket von FreeBSD. Es implementiert eine Simple Stateful Logic. Das Paket besteht aus sieben verschiedenen Komponenten: - Kernel Firewall Filter Rule Processor Packet Accounting LoggingNAT Dummynet Traffic Shaper Bridge Stealth IPFW ist in der Basisinstallation von FreeBSD enthalten. Um Logging persistent einzuschalten müssen über sysctl die folgenden Statements gesetzt werden: sysctl net.inet.ip.fw.verbose=1 sysctl net.inet.ip.fw.verbose_limit=5 Danach wird die Firewall aktiviert. firewall_type="open" firewall_logging="YES" # gleiche Funktion wie sysctl verbose = 1 Mögliche Typen sind Typ open client simple closed UNKNOWN filename Erklärung Allen Verkehr zulassen Nur diesen Host Schützen Ganzes Netz beschützen Verkehr blockieren Verhindert das Laden von FW Regeln Pfad zur Regel Datei Die genaue Konfiguration kann durch den Eintrag firewall_script=“/etc/ipfw.rules“ geladen werden. Die Konfiguration selbst wird in die Rules File geschrieben. Das Tool ipfw kann diese Einstellungen zwar ändern, jedoch sind die Änderungen nicht persistent. Das Kommandot ipfw –a list Zeigt alle derzeitig aktiven Regeln an. Jeder Dienst im Netzwerk ist über ein Protokoll und einen Port eindeutig spezifiziert. Dadurch können Regeln eindeutig festgelegt werden. Regel Syntax Die Syntax lässt sich im Allgemeinen wie folgt beschreiben: CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL CMD Das Kommando lautet add zum Hinzufügen der Regel zur Firewall RULENUMBER Jede Regel erhält eine Nummer zwischen 0 und 65535. Hierbei gilt „First Match Wins“, also die erste Regel die zutrifft wird angewendet. Das letzte Statement ist immer deny ip from any to any Welche in Kraft tritt, wenn keine explizite Erlaubnis für ein Paket gegeben ist. Das Paket wird dann ohne eine Benachrichtigung an den Sender zu schicken verworfen. Die Firewall ist damit eine „inklusive“, enthält also eine Whitelist. Es alles verboten was nicht ausdrücklich zugelassen ist. ACTION Um Verkehr zuzulassen kann eines der folgenden Schlüsselwörter verwendet werden: - accept add pass permit Das verweigern einer Verbindung geschieht über die Schlüsselwörter - deny drop Wird - check-state angegeben so wird die dynamische Regeltabelle überprüft. Diese Aktion verwendet kein Selektions Satement. LOGGING Mögliche Werte sind - log logamount Wird logamount angegeben, so wird die Anzahl an Ereignissen geloggt, die in Amount angegeben sind. Wird nur log angegeben so wird der Wert aus net.inet.ip.fw.verbose_limit verwendet. Die Log Einträge werden an den System Log Daemon syslogd weitergeleitet. Dieser wird über die Datei /etc/syslog.conf konfiguriert und loggt (laut deren Standard) alle Einträge in die Datei /var/log/security. SELECTION Die Selektion setz sich aus den folgenden Teilen zusammen: PROTOKOLL IP_MATCH PORT DIRECTION INTERFACE END PROTOKOLL Das Protokoll entstammt einem Wert aus der Datei /etc/protocols. Allgemein wird hier tcp | udp | icmp verwendet. IP_MATCH Als zutreffende IP Adresse für die Regel wird from <src> to <dest> verwendet. Src entspricht der Quelle (Source) dest der Destination, also dem Ziel das Pakets.Statt einer IP Adresse kann hier auch das Schlüsselwort any angegeben werden, das sämtlichen Verkehr beinhaltet. Das Schlüsselwort me hingegen wertet alle zugewiesenen Adressen aller konfigurierten Interfaces aus. Adressen werden in der Punktform angegeben: 192.168.0.1. Es kann auch die Subnetzmaske nachgestellt werden: 172.21.255.2/24 PORT Danach folgt die Portnummer des Verkehrs, sofern das angegebene Protokoll Portnummern interpretiert (TCP / UDP). Anstatt numerischer Portnummern können auch die Einträge aus der Datei /etc/services verwendet werden. DIRECTION Die Richtung des Verkehrs muss mit angegeben und wird über in oder out spezifiziert. INTERFACE Das Interface gibt an, an welchem Interface die Pakete geprüft werden. Dies ist meist vom Routing abhängig. Die syntax lautet via <interfacename> END Am Ende eines Statements muss die folgende Phrase auftauchen: setup keep-state Das Schlüsselwort Setup dient der Statusverbindung von TCP Paketen. Keep-state dient der Stateful Eigenschaft der Firewall. Wird schließlich das Schlüßelwort limit mit angegeben, so können nur eine bestimmte Anzahl an Verbindungen aufgebaut werden. Dieses Schlüsselwort und keep-state schließen sich gegenseitig aus. Scripting Zum Scripten der Firewallregeln dient ein Shellscript. Dieses Script kann ausgeführt werden, ohne das System neu zu starten und kann Variablen verwenden was die Tipparbeit erleichtert. Das Script lässt sich in vier Bereiche gliedern: - Alles zulassen für bestimmte Teilnehmer Ausgänge zulassen Eingänge zulassen Restlichen Verkehr loggen und aussperren Normalerweise würde eine geordnete Liste nach diesem Schema genügen, jedoch ist in der aktuellen Topologie ist NATD aktiv, der den DIVERT Befehl erfordert. Divert löst die Kapselung der Pakete auf (in), so dass diese wieder an die Hosts hinter der Firewall geschickt werden können. Dazu überspringen alle Pakete die zugelassen werden sollen die Verarbeitung der Regeln bis zur Regel 500. ################################# # ipfw config script ## Run this script with: # sh /etc/ipfw.rules ################################# # flush all ipfw -q -f flush cmd="ipfw -q add" pif="nfe0" ks="keep-state" skip="skipto 500" # -q: Quiet qxecution # outbound interface # Allowed services using the following ports # ports: ssh, smtp, time, whois, dns, http, https, pop, pops, # imap, imaps, icq/aim tcp_services="22,25,37,43,53,80,443,110,995,143,993,5190" $cmd 002 allow all from any to any via rl0 # lan $cmd 003 allow all from any to any via lo0 # loopback $cmd 100 divert natd ip from any to any in via $pif $cmd 101 check-state # Special - needed to allow DNS requests to the router () $cmd 120 $skip udp from any to any 53 out via $pif $ks $cmd 125 $skip tcp from any to any $tcp_services out via $pif setup $ks $cmd 130 $skip icmp from any to any out via $pif $ks $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 $cmd 301 deny all from 172.16.0.0/12 to any in via $pif $cmd 302 deny all from 10.0.0.0/8 to any in via $pif $cmd 303 deny all from 127.0.0.0/8 to any in via $pif $cmd 304 deny all from 0.0.0.0/8 to any in via $pif $cmd 305 deny all from 169.254.0.0/16 to any in via $pif # dhcp auto conf $cmd 306 deny all from 192.0.2.0/24 to any in via $pif # RFC 3330 TESTNET $cmd 307 deny all from 204.152.64.0/23 to any in via $pif # sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif # class d & e multicast # allow inbound traffic # eg. webserver, limited to 2 connections per client (contra DDoS) ## $cmd 400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Kill unauthorized traffic from/to internet $cmd 450 deny log ip from any to any $cmd 500 divert natd ip from any to any out via $pif $cmd 510 allow ip from any to any $cmd 999 deny log all from any to any Erklärung des Scripts: - 002: Der Lan Verkehr wird nicht angefasst 003: Loopback Verkehr wird nicht angefasst 100: NATD Auflösung für eingehenden Verkehr 101: Check State Überprüfung ob packet Antwort einer angeforderten „stateful“ Verbindung ist 120 – 130: Zulassen des ausgehenden Verkehrs für verschiedene Dienste für Email und Web 300 – 308: Sperren von eingehendem Verkehr bestimmter Netzbereiche (private Netze und Dienste) 450: Logging und sperren von nicht festgelegtem ausgehenden und eingehenden Verkehr mit dem Internet 500: Einsprungspunkt für NAT Kapselung 999: Logging des restlichen Verkehrs Die Konfiguration kann als Script ausgeführt werden. Wird diese in der Datei /etc/ipfw.rules gespeichert, dann kann es mit dem Befehl sh /etc/ipfw.rules ausgeführt werden. Das Script legt hohen Wert auf Sicherheit. Die RFC 1918 Bereiche für interne Netze sowie NETBIOS Dienste werden blockiert. Aller Verkehr von außen wird abgeleht, sofern er nicht angefordert ist. Vom internen Netz aus erlaubt sind Email und Http Verkehr sowie diverse andere Dienste, auch mit SSL Verschlüsselung. Erlaubt sind: - 22: SSH 25: smtp - 37: time 43: whois 53: dns 80: http 443: https 110: pop 995: pop mit SSL 143: imap 993: imaps 5190: icq / aim IPFILTER (IPF) Ipfilter ist eine quelloffene Firewalllösung. Diese Firewall ist plattformunabhängig und verfügbar für OpenBSD, NetBSD, FreeBSD sowie SunOS. IPF verwendet das „ipf“ Tool zur Konfiguration. Logging geschieht über das tool „ipmon“, Statistiken sind mit „ipstat“ abrufbar. NAT geschiet mittels „ipnat“. Ursprünglich war IPF nicht stateful und implementierte das LAST MATCHING RULE Konzept. Eine modernere Version von IPF deckt jedoch stateful logic ab. Verwenden von ipf Aktivieren über Eintragungen in /etc/rc.conf ipfilter_enable="YES" # Start ipf firewall ipfilter_rules="/etc/ipf.rules" ipmon_enable="YES" # logging ipmon_flags="-Ds" # -D: daemon, -s: to syslog gateway_enable="YES" Das NAT für das LAN wird nicht mehr über NATD sondern über ipnat gelöst: ipnat_enable="YES" ipnat_rules="/etc/ipnat.rules" Die aktiven Regeln können mit ipstat –in für eingehenden Verkehr oder ipstat –on für ausgehenden Verkehr abgerufen werden. Regel Syntax ACTION DIRECTION OPTIONS SELECTION PROTO SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG STATEFUL ACTION Mögliche Werte: - block – Verkehr Blockieren pass – Verkehr zulassen DIRECTION Mögliche Werte: - in out OPTIONS Mögliche Werte: - - log: Loggt die Verbindung quick: Trick, um das LAST MATCHING RULE Verfahren zu umgehen. Sind die Selektionsparameter der Regel zutreffend, wird diese Regel zuletzt geprüft. Dieser Parameter muss angegeben werden. on <interface> SELECTION PROTO Proto wird benötigt um das zu prüfende Protokoll anzugeben. Proto wird dann gefolgt von proto tcp/udp | tcp | udp | icmp oder vom entsprechenden Protokoll aus der Datei /etc/protocols SRC, DST Danach folgt die Route des Pakets. Diese wird mit from <source> to <dest> angegeben. Die Adresse wird in der Punktnotation, die SN in Bitdarstellung angegeben, also 0.0.0.0/8 oder 192.168.5.6/24. Auch sind any und me verwendbar. PORT Als Port kann entweder ein Integerwert (Portnummer) oder der entsprechende Dienstname aus der /etc/services verwendet werden. Um Portbereiche festzulegen können Vergleichsoperatoren verwendet werden. Diese halten sich an die Syntax der boolschen Logik aus C. Sie können auch über ein Literalesäquivalent angegeben werden, also = als eq, kurz für equals. Operatoren: Operator =, eq !=, ne <, lt >, gt <=, le >=, ge Beschreibung Equals, Ist Gleich Not Equals, Ist Nicht Gleich Less Than, Kleiner als Greater Than, Größer als Less Equals, Ist Kleiner Gleich Greater Equals, Ist Größer Gleich TCP Flags STATEFUL Danach wird die Statefulness aktiviert. Soll eine verbindung eine Sitzung aufbauen so erhält sie als Schlüsselwort flags S keep state Flags S hat die gleiche Wirkung wie „setup“ bei ipfw. Eine komplette Regel hat nun die Syntax: pass out quick on nfe0 proto tcp from any to any port = 80 flags S keep state Diese Regel ermöglicht HTTP Verkehr nach aussen. NAT mit IPF Um NAT Funktionalität für das LAN zu aktivieren verwendet man in der /etc/rc.conf die folgenden Einträge: ipnat_enable=“YES“ ipnat_rules=“/etc/ipnat.rules“ Um die Regeldatei neu zu laden wird der folgende Befehl verwendet: ipnat –CF –f /etc/ipnat.rules Die aktuellen NAT Regeln werden mit ipnat –l angezeigt. Die eigentliche Konfiguration der NAT Regeln läuft über ein SH Script. IPF Firewall Script # sh symbols pif="nfe0" fsk="flags S keep state" router=”192.168.1.1” # flags S needed to establish session, # compares to "setup" statement on ipfw # flush all and pass script to ipf. # by doing this the script can be run by sh and use symbolic substitution # this is helpful for the current developing purposes # -Fa: flush all, -f: rules file to load /sbin/ipf -Fa -f - << EOF # don't touch inside lan traffic pass out quick on rl0 all pass in quick on rl0 all # don't touch loopback pass in quick on lo0 all pass out quick on lo0 all # dns pass out quick on $pif proto tcp from any to $router port = 53 $fsk pass out quick on $pif proto udp from any to $router port = 53 keep state # allow used services behind pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto pass out quick on $pif proto the tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp fw from from from from from from from from from from from from any any any any any any any any any any any any to to to to to to to to to to to to any any any any any any any any any any any any port port port port port port port port port port port port = = = = = = = = = = = = 22 $fsk # ssh 25 $fsk # smtp 37 $fsk # time 43 $fsk # whois 53 $fsk # dns 80 $fsk # http 443 $fsk # https 110 $fsk # pop 995 $fsk # pops 143 $fsk # imap 993 $fsk # imaps 5190 $fsk # icq #ping pass out quick on $pif proto icmp from any to any icmp-type 8 keep state # SPECIAL: Allow FTP (for clients behind fw or pkg_add), sftp uses ssh port pass out quick on $pif proto tcp from any to any port = 21 $fsk # block and log block out log first quick on $pif all # block all inbound traffic block in quick on $pif from block in quick on $pif from block in quick on $pif from block in quick on $pif from block in quick on $pif from block in quick on $pif from block in quick on $pif from block in quick on $pif from block in quick on $pif from from non routable or reserved addr spaces 192.168.0.0/16 to any # rfc 1918 priv ip 172.16.0.0/12 to any 10.0.0.0/8 to any 127.0.0.0/8 to any # loopback 0.0.0.0/8 to any 169.254.0.0/16 to any # DHCP auto conf 192.0.2.0/24 to any # doc net 204.152.64.0/23 to any # sun cluster 224.0.0.0/3 to any # class D&E MC # dont log fragmented, late arriving packets block in quick on $pif all with frags block in quick on $pif proto tcp all with short # block source routed packtes (?!) block in quick on $pif all with opt lsrr block in quick on $pif all with opt ssrr # Kill and log Fingerprint attempts # fingeprint determines the os and open ports # (usually done with nmap by hackers) block in log first quick on $pif proto tcp from any to any flags FUP block in quick on $pif all with ipopts # block public pings block in quick on $pif proto icmp all icmp-type 8 # block ident block in quick on $pif proto tcp from any to any port = 113 # netbios, hosts2name srv req block in log first quick on $pif block in log first quick on $pif block in log first quick on $pif block in log first quick on $pif proto proto proto proto tcp/udp tcp/udp tcp/udp tcp/udp from from from from any any any any to to to to any any any any port port port port = = = = 137 138 139 81 # # if webserver available allow inbound http traffic # pass in quick on $pif proto tcp from any to any port = 80 $fsk # blocks the rest making the script inclusive block in log first quick on $pif all # eof is required for this script to be passed as a shell call parameter EOF Das Script erlaubt allen nötigen Diensten den Zugriff ins Internet und blockt Nicht-Routbare Bereiche und potentielle Attacken aus dem Internet. Der Lan - Verkehr wird nicht beeinträchtigt. IPNAT Network Address Translation Script Die Regeldatei für IPNAT weist eine Besonderheit auf. Unter normalen Umständen ist das Betreiben von FTP Clients hinter einer NAT Firewall nur schwer möglich. Das liegt daran dass NAT in die Adressen eingreift die sich für FTP dann auf falsche Ports beziehen können. IPNAT bietet dafür eine Proxy Konfiguration: map nfe0 192.168.2.0/24 -> 0/32 proxy port 21 ftp/tcp map nfe0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp map nfe0 192.168.2.0/24 -> 0/32 Die erste und zweite Zeile dienen als FTP Proxy. Dieser ist transparent für den Client hinter der Firewall. Ist eine FTP Funktion nicht erwünscht, so können die ersten beiden Zeilen weggelassen werden. Die letzte Zeile ist wichtig, sofern NAT erwünscht oder erforderlich ist; Sie verwaltet allgemeines NAT und mappt allen Verkehr aus dem x.2.0 er Netz auf die Firewall. Packet Filter (PF) Im July 2003 wurde die OpenBSD Software „Packet Filter“, im Folgenden kurz PF genannt auf FreeBSD portiert. Sie stellt das dritte Firewall Packet dar, das unter FreeBSD verfügbar ist. PF wurde entwickelt als OpenBSD, welches als Standard IPFilter enthielt damit Lizenzprobleme bekam. Als Ersatz wurde PF entwickelt, daher sind sich die beiden Programme sehr ähnlich, besonders bei der Erstellung der Regeln. Verwendung Auch PF wird über Einträge in der /etc/rc.conf beim Booten als Dienst gestartet. pf_enable="YES" pf_rules="/etc/pf.rules" pf_flags="" pflog_enable="YES" pflog_logfile="/var/log/pflog" pflog_flags="" Das Tool „pfctl“ erlaubt weitere Einstellungen von PF. Um die Regeldatei neu zu laden ohne das System neu zu starten kann das folgende Kommando verwendet werden: pfctl –F all –f /etc/pf.rules Das Kommando löschst zunächst alle vorhandenen Regeln und läd sie dann aus der Date /etc/pf.rules neu. Um eine Regeldatei lediglich zu parsen um sie beispielsweise auf Fehler zu prüfen kann der folgende befehl verwendet werden: pfctl –vnf /etc/pf.rules Regel Syntax action [direction] [log] [quick] [on interface] [af] [proto protocol] \ [from src_addr [port sr_port]] [to dst_addr [port dst_port]] \ [flags tcp_flags] [state] Die Syntax entsprich weitestgehend der Syntax von IPFilter, daher wird an dieser Stelle lediglich das fertige PF Script der Firewall vorgestellt. Auch IPF verwendet LAST MATCH WINS, sofern nicht das QUICK Schlüsselwort angegeben wird. QUICK dreht (wie auch bei IPF) das Prinzip zu FIRST MATCH WINS um.Die folgenden Regeln sind daher mit dem Schlüsselwort Quick versehen um weiterhin die Verwendung des FIRST RULE WINS Paradigmas zu implemtieren, welches auch für die anderen Firewalllösungen verwendet wurde. ext_if="nfe0" int_if="rl0" localnet=$int_if:network tcp_services="{ ftp-data, ftp, ssh, smtp, domain, auth, pop3, pop3s, imap, imaps, http, https, 5190 }" udp_services="{ domain, ntp }" # Run this as a shell script with # # sh /etc/pf.rules # pf rule files (should be named pf.conf, i know) support symbolic substitution # and macros but i like to make shell comments and stuff. . . # Using the quick keyword the interpretation of the rules turns the concept to # first rule wins. # Flush and reload packet filter config pfctl -F all -f - << EOF set loginterface $ext_if # do nat mapping nat on $ext_if from $localnet to any -> ($ext_if) # don't touch lan and loopback traffic pass out quick on $int_if all pass in quick on $int_if all pass in quick on lo0 all pass out quick on lo0 all # allow dns requests pass out quick on $ext_if proto tcp from any to 192.168.1.1 port = 53 flags S/SA keep state pass out quick on $ext_if proto udp from any to 192.168.1.1 port = 53 keep state # allow tcp service, web, mail, im, etc. pass out quick on $ext_if proto tcp from any to any port $tcp_services flags S/SA keep state # allow outbound pings pass out quick on $ext_if proto icmp from any to any # block & log the rest (out) block out log(all) quick on $ext_if all # block inbound traffic from reserved locations block in quick on $ext_if from 192.168.0.0/16 to any block in quick on $ext_if from 172.16.0.0/12 to any block in quick on $ext_if from 10.0.0.0/8 to any block in quick on $ext_if from 0.0.0.0/8 to any block in quick on $ext_if from 169.254.0.0/16 to any # dhcp auto block in quick on $ext_if from 192.0.2.0/24 to any # doc net block in quick on $ext_if from 204.152.64.0/23 to any # sun cluster block in quick on $ext_if from 224.0.0.0/3 to any # cls D&E mc #ping block in quick on $ext_if proto icmp from any to 192.168.2.0/24 #netbios block = 137 block = 138 block = 139 block = 81 in log (all) quick on $ext_if proto { tcp, udp } from any to any port in log (all) quick on $ext_if proto { tcp, udp } from any to any port in log (all) quick on $ext_if proto { tcp, udp } from any to any port in log (all) quick on $ext_if proto { tcp, udp } from any to any port # allow ws traffic if available pass in quick on $ext_if proto tcp from any to any port = 80 flags S/SA keep state #block and lock anything else block in log(all) quick on $ext_if #end of file for shell script EOF Das Script entspricht den anderen. Es lässt benötigte Dienste zu, blockiert mögliche Angreifer und nicht routbare Bereiche. Interessant ist das Logging, sowie die NAT Konfiguration. set loginterface $ext_if # do nat mapping nat on $ext_if from $localnet to any -> ($ext_if) # . . . block in log(all) quick on $ext_if Hier unterscheidet sich die Notation von der des ipf. IPTABLES Unter Linux werden Firewalls mit der Software Netfilter aufgesetzt. Das Konfigurationsprogramm für Netfilter nennt sich IPTABLES. Als Distribution wird Debian verwendet. Zunächst wird die Datei /etc/sysctl.conf angepasst. Diese entspricht in etwa der /etc/rc.conf unter FreeBSD. Darin befinden sich auskommentiert die beiden folgenden Einträge net.ipv4.conf.default.forwarding=1 net.ipv6.conf.default.forwarding=1 Diese werden durch entfernen der Auskommentierung aktiviert. Sind die Einträge nicht vorhanden können sie per Hand hinzugefügt werden. Damit fungiert Debian als Gateway. Diese Einstellung wird beim Systemstart verwendet. Zur Laufzeit kann die Variable über das Tool sysctl gesetzt werden: sysctl net.ipv4.conf.default.forwarding=1 Script [Script Here] Ausblick Dieses Dokument deckt nicht alle Komponenten ab, die eine gute Firewall ausmachen. Es ist zu empfehlen, den folgenden Bereichen Aufmerksamkeit zu widmen, um die gesamt Mächtigkeit einer Firewall ausnutzen zu können. Traffic Shaping Um die Firewall sinnvoll einzusetzen können zusätzlich QoS Dienste aktiviert werden. Diese dienen beispielsweise dem Traffic Shaping, also dem garantieren von Bandbreitenkontingenten für bestimmte Dienste. IP Telefonie könnte beispielsweise regulärem http Verkehr vorgezogen werden. Es gibt mehrere Pakete die dies ermöglichen. Direkt verbandelt mit PF ist Alternative Queing (altq), mit ipf/ipfw eignet sich „dummynet“. Bridging Wird die Firewall als Bridge implementiert, so ist sie im Netzwerk nicht sichtbar und dadurch schwerer anzugreifen. In der Regel besitzt sie dann keine IPs. Mit OpenBSD ist sie trotzdem noch in der Lage Pakete zu filtern. Ohne die Erreichbarkeit aus dem Netzwerk muss die FW jedoch direkt über die Konsole konfiguriert werden, weil keine Remote Verbindung über ssh oder telnet zu ihr aufgebaut werden kann. Kernel Compilierung Um nicht zu tief in die eigentliche Unix Materie einzusteigen wurde in dieser Doku der Bezug zum Kernel Compiling weggelassen. Laufen die Firewalls als Module, so ist deren Anhang Quellen FreeBSD Handbook http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls.html Diverse Threads aus BSDForen.de http://www.bsdforen.de/ “Firewalling with OpenBSD's PF packet filter” von Peter Hansteen http://home.nuug.no/~peter/pf/en/long-firewall.html http://home.nuug.no/~peter/pf/ “TCP/IP Primer” von Daryl Banttari http://www.ipprimer.com/overview.cfm IPTables Tutorial von Oskar Andreasson http://iptables-tutorial.frozentux.net/iptables-tutorial.html Andrew S. Tannenbaum – Computernetzwerke, 4. Auflage, ISBN 3-8273-7046-9 Verwendete Programme Microsoft Word FreeBSD: IPFW, IPF, PF, ee Debian: IPTABLES VMWare Workstation Downloads Alle Downloads verfügbar unter http://cessor.de/misc/fw/