Firewalls unter Linux

Allgemeine Erläuterung Die Syntax von IPCHAINS Ein Beispiel

Einleitung

Was tut eine Firewall unter Linux?

Die Firewall unter Linux ist direkt in den Kernel eingebaut und filtert anhand vom Benutzer vorzugebender Regeln TCP/IP-Pakete, beziehungsweise leitet sie weiter ans interne Netz (Man kann dies als Routing bezeichnen, heissen tuts IP-Forwarding).

Welche Programme stehen zur Konfiguration der Linux Firewall zur Verfügung?

In der Kernelreihe 2.2.x steht für die Firewallkonfiguration das Programm ipchains zur verfügung.

Nach welchen Kriterien werde die TCP/IP-Pakete untersucht?

Zu ersteinmal: TCP/IP ist eine Protokollsuite, die Sitzungsbasierte Verbindungen im Internet, über die Datenströme zwischen entfernten Rechnern transportiert werden, ermöglicht. IP - Internetprotokoll - ist ein verbindungsloses Protokoll, das sich nur darum kümmert, dass ein Datenpaket - sprich eine festgelegte Menge an Daten, versehen mit einem Header - über das Inter-/Intranet von Rechner A zum Rechner B gelangt. IP kümmert sich nicht darum, ob die Pakete in der richtigen Reihenfolge ankommen, ob die VErbindung hergestellt worden ist, ob der Kommunikationspartner die Pakete überhaupt empfängt - um diese Dinge kümmert sich TCP - Transport Control Protocol. Dieses protokol kümmert sich, auf IP aufsitzend, darum, dass die Daten den richtigen Applikationen zugeordnet und dass die fehlenden Daten nachgeliefert werden. Dies ist grob umrissen die Tätigkeit der TCP-IP-Protokoll-Suite.

Die Firewall inspiziert den Header von TCP/IP: Empfängeradresse/SenderAdresse, Empfängerport (Die Applikation, die das Paket empfängt), Senderport (die Applikation, die das Paket absendet), Statusbits des TCP-Headers (Syn/ACK, etc...).
Keinesfalls jedoch inspiziertd ie Firewall denInhalt der Pakete, wenn man mal von den sündhaft teuren Firewalls absieht, die STATEFUL INSPECTION betreiben, also auch den Inhalt der Pakete untersuchen.

Die Kriterien, nach denen die Paket-Header untersucht werden, legt man mittels Kommandos fest. Diese Kommandos beschreiben Inhalte des TCP/IP-Headers, nach denen die Firewall entscheidet, ob ein Paket weitergeleitet, verworfen ode rabgelehnt wird.

Bei der Konfiguration der Firewall muss man folgendes beachten: Ein TCP/IPPaket trifft ein, und die Regeln in der Firewall-Regelliste werden eine nach der anderen auf Zutreffen überprüft. Sobald eine Regel zutrifft, wird diese Regel auf das TCP/IP-Paket angewandt, und das Paket wird entweder abgewiesen (reject/deny) oder angenommen (accept). Das nächste TCP/IP-Paket wird überprüft. Die Regeln müssen daher sogestaltet sein, dass allgemeine DInge gleich zu Beginn der Regelliste angeführt werden (DNS, DHCP, FTP, MAIL, HTTP, ANTI-Spoofing etc), und Besondere Dinge wie zb. das Sperren einzelner IP-Adressen eher am ende der Regeln steht. Wichtig: Trifft keine Regel in auf ein Paket zu, so wird die allgemeine POLICY der jeweiligen Regel-Chain, in IPChains Input, Foprward, Output, darauf angewandt, dh. es wird entweder verworfen oder angenommen per default.

Aus letzterem Satz folgt, dass man besonders bei der Chain INPUT generell die Policy DENY setzen und anschliessend deklarieren sollte, was man durchlassen will an TCP/IP-Paketen. Gleiches kann man bei der Chain OUTPUT tun, während man die Chain Forward, die fürs Masquerading geeignet ist, ruhig auf der Default Policy ACCEPT stehen lassen kann.

DIESE Chains ...
Die "Chains" von ipchains fassen die Regeln für eingehende, ausgehende und weitergeleitete Pakete zusammen:

Allgemeine Erläuterung Die Syntax von IPCHAINS Ein Beispiel

Die Syntax von IP-Chains

Wie schaut das IPCHAINS-Kommando aus?

die Syntax geht so:

ipchains -A|-I [Chain]
[-i Interface]
[-p Protokoll]
[[!]-y]
[-s Adresse [Port[:Port]]]
[-d Adresse [Port[:Port]]]
-j Policy
[-l]

Die Optionen im einzelnen:

-A[Chain] : hängt eine Regel ans Ende einer Chain an. Wenn kein Chain angegeben wird, gilt die neue Regel für alle Chains.

-I[Chain]: Fügt eine Regel vor dem Anfang einer Chain ein.Wenn keine Chain angegeben wird, gilt die Regel für alle Chains.

-i [interface]: Netzwerk-Interface, für das die Regel gilt. Wenn die Option -i nicht angegeben wird, gilt die Regel für alle Interfaces. Typische Namen für Interfaces: eth0,eth1,lo,ppp0

-p Protokoll: IP-Protokoll, für das die Regel gilt. Wird die Option -p nicht angegeben, gilt die Regel für alle Protokolle.Mögliche Protokolle: TCP,UDP,ICMP,ALL, sowie alle Namen und Nummern aus /etc/protocols

-y : Das SYN-Flag einer TCP-Nachricht muss gesetzt, das ACK-Flag darf nciht gesetzt sein, d.h. das Paket muss das Erste Paket des HANDSHAKES für den Verbindungsaufbau sein. Wenn weder -y noch !-y angegeben sind, werden die TCP-Flags nicht überprüft.

!-y: Das ACK-Flag einer TCP-Nachrift muss gesetzt sein, d.h. das Paket muss eine Antwort im Handshake für den Verbindungsaufbau darstellen oder Teil einer bereits bestehenden Verbindung sein.

-s Adresse[Port]: Absender-Adresse des Paketes. Wenn keine Absenderadresse angegeben ist, sind alle unicast adressen erlaubt. Wenn zusätzlich eine Portnummer oder ein Portnummern-Bereich angegeben wird, gilt diese Regel für den Port respektive den Portnummern-Bereich. Eine Regel ohne explizite Portangabe gilt für alle Ports. Port-Bereiche werrden durch Port:Port angegeben. --> von-Port:bis-Port.

-d Adresse[Port]: Empfänger-Adresse des Paketes. Wenn keine Empfängeradresse angegeben ist, sind alle unicast adressen erlaubt. Wenn zusätzlich eine Portnummer oder ein Portnummern-Bereich angegeben wird, gilt diese Regel für den Port respektive den Portnummern-Bereich. Eine Regel ohne explizite Portangabe gilt für alle Ports. Port-Bereiche werrden durch Port:Port angegeben. --> von-Port:bis-Port.

-j Policy: Was soll mit dem Paket geschehen: ACCEPT: Das Paket annehmen; REJECT: Das Paket zurückweisen mit ICMP-Nachricht an Sender; DENY: Das Paket verwerfen; MASQ: Network Adress Translation auf dieses Paket anwenden (geht nur in der Forward Chain).

-l: Logging: Wenn eine Regel auf ein Paket zutrifft, dies im Systemlog aufzeichnen. (Meldung der facility kern mit Priorität info landet im syslog. Das findet man dann in /var/log/messages od. ähnlichem Verzeichnis)

Allgemeine Erläuterung Die Syntax von IPCHAINS Ein Beispiel

Ein Beispiel

#!/bin/bash
EXTERN=”eth0”
INTERN=”eth1”
LOOPBACK=”lo”
IPADDR_EXT=”212.17.92.106”
IPADDR_INT=”192.168.0.1”
ANYADDR=”any/0”
DNS1=”195.34.133.10”
DNS2=”195.34.133.11”
#flush the ipchains rules and set the policies
ipchains –F
ipchains –P input DENY
ipchains –P output DENY
ipchains –P forward REJECT

#activate masquerading and add the ftp masquerading module to the kernel.
ipchains –M –S 7600 30 10
/sbin/modprobe ip_masq_ftp.o

#deny fragmented packets
ipchains –A input –f –i INTERN –j DENY

#activate TCP SYNCOOKIES
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

#protect against ip spoofing
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done

#deny ICMP Redirects
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done

#deny packets routed by sender
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done

#free action for Loop back device
ipchains –A input –i $LOOPBACK –j ACCEPT
ipchains –A output –i $LOOPBACK –j ACCEPT

#deny Packets from loopback to ext. interface
ipchains –A input –i $EXTERN –s 127.0.0.0/8 –j DENY
ipchains –A output –i $EXTERN –s 127.0.0.0/8 –j DENY –l

#deny spoofed packets from out own addresss
ipchains –A input –i $EXTERN –s $IPADDR_EXT –j DENY –l

#deny wrong broadcast packets
ipchains –A input –i $EXTERN –s 255.255.255.255 –j DENY
ipchains –A input –i $EXTERN –s 0.0.0.0 –j DENY
ipchains –A output –i $EXTERN –s 255.255.255.255 –j DENY
ipchains –A output –i $EXTERN –s 0.0.0.0 –j DENY

#a little bit of flow control
ipchains –A input –i $EXTERN –p icmp –s $ANYADDR 4 –d $IPADDR_EXTERN -j ACCEPT
ipchains –A output –i $EXTERN –p icmp –s $ANYADDR 4 –d $IPADDR_EXTERN -j ACCEPT

#incoming/outgoing error messages
ipchains –A input –i $EXTERN –p icmp –s $ANYADDR 12 –d IPADDR_EXTERN -j ACCEPT
ipchains –A output –i $EXTERN –p icmp –s $ANYADDR 12 –d IPADDR_EXTERN -j ACCEPT

#length negotiation, service or dest not available
ipchains –A input –i $EXTERN –p icmp –s $ANYADDR 3 –d IPADDR_EXTERN -j ACCEPT
ipchains –A output –i $EXTERN –p icmp –s $IPADDR_EXTERN 12 –d IPADDR_EXTERN fragmentation-needed –d $ANYADDR -j ACCEPT

#allow outgoing pings:
ipchains –A output –i $EXTERN –p icmp –s $IPADDR_EXTERN 8 –d $ANYADDR -j ACCEPT
ipchains –A input –i $EXTERN –p icmp –s $ANYADDR 0 –d IPADDR_EXTERN -j ACCEPT

#allowing dns access for surfing:
ipchains –A output –i $EXTERN –p udp –s $IPADDR_EXTERN 1024:65535 -d 195.34.133.10:53 –j ACCEPT
ipchains –A input –i $EXTERN –p udp –s 195.34.133.10 53 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d 195.34.133.10 53 –j ACCEPT
ipchains –A input –i $EXTERN –p tcp ! -y –s 195.34.133.10:53 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#Receiving Email via POP3 Server (p.ex. pop.chello.at)
ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d pop.chello.at 110 –j ACCEPT
ipchains –A input –i $EXTERN –p tcp ! -y –s pop.chello.at 110 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#http access:
ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d $ANYADDR 80 –j ACCEPT ipchains –A input –i $EXTERN –p tcp ! -y –s $ANYADDR 80 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#https access:
ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d $ANYADDR 443 –j ACCEPT ipchains –A input –i $EXTERN –p tcp ! -y –s $ANYADDR 443 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#ftp access outgoing
ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d $ANYADDR 21–j ACCEPT
ipchains –A input –i $EXTERN –p tcp ! -y –s $ANYADDR 21 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#ftp in active mode:
ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d $ANYADDR 20 –j ACCEPT
ipchains –A input –i $EXTERN –p tcp ! -y –s $ANYADDR 20 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#ftp in passive mode:
ipchains –A output –i $EXTERN –p tcp –s $IPADDR_EXTERN 1024:65535 -d $ANYADDR 1024:65535 –j ACCEPT
ipchains –A input –i $EXTERN –p tcp ! -y –s $ANYADDR 1024:65535 –d $IPADDR_EXTERN 1024:65535 –j ACCEPT

#no constraints for LAN Users:
ipchains –A input –i $INTERN –s 192.168.0.0/24 –j ACCEPT
ipchains –A output –i $INTERN –d 192.168.0.0/24 –j ACCEPT

#MASQ all internal computers, so that internat can’t see them nor get access to them
#all internal packets with destination in the internet will be sent throu masquerading

ipchains –A forward –I $EXTERN –s 192.168.0.0/24 –j MASQ

#finito
Dies ist nur ein Beispiel, wie man ein Firewallskript aufbauen könnte: Z.b. kann man noch den DHCP-POrt für den DHCP-Client freischalten, falls man Chello-User ist.