Red Hat Linux Firewalling


1. Red Hat Linux Firewalling

Red Hat Enterprise Linux und Fedora Core kommen beide mit recht guten Standard-Firewall-Einstellungen. Diese erlauben aber standardmäßig überhaupt keine Verbindungen, und sind nicht an die Bedürfnisse der LFU Innsbruck angepasst.

 

Wir stellen Ihnen hier daher das Regelwerk vor, das auch wir auf vielen Systemen verwenden. Untenstehende Regeln sind sehr restriktiv und sollten Ihnen einen guten Schutz bieten. Hier werden von außerhalb nur Verbindungen auf den lokalen SSH Server erlaubt, und die nur innerhalb der Universität Innsbruck.

Sie können unsere Beispielkonfiguration herunterladen unter: ftp://zid-luxinst.uibk.ac.at/mirror/iptables-rules/iptables

Zuerst werden die Standardaktionen gesetzt, die zutreffen, wenn keine Regel passt. Eingehender Verkehr wird verworfen, ebenso weiterzuleitender Verkehr (falls der Rechner mehrere Netzwerkkarten hat und IP Forwarding eingeschaltet ist). Ausgehender Verkehr wird standardmäßig zugelassen.

 
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

Danach wird sämtlicher Verkehr des Loopback Interface, d.h. der Rechner-interne Verkehr, zugelassen.

-A INPUT -i lo -j ACCEPT

Dann werden hier Pakete verworfen, die versuchen, gleichzeitig die Verbindung zu öffnen und gleich wieder zu schließen. Das wird sehr gerne bei Scans verwendet.

-A INPUT -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix "SYN/FIN packet"
-A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP

Es folgt ein Abschnitt, der versucht, Denial of Service Attacken durch ICMP Ping Pakete zu unterbinden.

-A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s -j ACCEPT

Nun folgt das Herzstück der Firewall-Regeln:

Die Zeile

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

bewirkt, dass alle Pakete, die sich auf eine bereits bestehende Verbindung beziehen oder mit dieser in Zusammenhang stehen, zugelassen werden. Das hat zwei wichtige Konsequenzen: Erstens können vom Rechner selbst nach außen Verbindungen aufgebaut werden, und die resultierenden Antwortpakete werden dann vom Firewall durchgelassen - es trifft ESTABLISHED zu. Zweitens ist es durch dieses „state module“ des Firewalls etwa möglich, dass komplexe Verbindungen wie FTP, die zwei oder mehr verschiedene Ports verwenden, trotzdem zu erlauben - hier wird RELATED wichtig.

Nun folgt der Abschnitt, in dem SSH von innerhalb der Universität Innsbruck zugelassen wird. Dafür verwenden wir eine etwas komplexere Struktur: Zuerst wird eine neue "Chain" "USER_SSH" - ein benutzerdefiniertes Regelwerk - definiert. In dieses kommen alle Verbindungen mit Zielport 22 (SSH):

 

-N USER_SSH
-A INPUT -p tcp -m tcp --dport 22 --syn -j USER_SSH

Wenn nun eine Verbindung in dieses Regelwerk kommt, überprüfen wir nun in dieser, ob wir die Adresse zulassen wollen. Im folgenden Beispiel werden die beiden an der Universität Innsbruck verwendeten Subnetze angegeben:

-A USER_SSH -s 138.232.0.0/16 -j ACCEPT
-A USER_SSH -s 172.24.0.0/13 -j ACCEPT

Dieses Kaskadieren in ein Unterregelwerk hat den Vorteil, dass nur noch eine Bedingung (das Subnetz) angegeben werden muss und nicht mehr die gesamte Bedingung (inklusive Port). Das hat den Vorteil, dass speziell große Regelwerke einfacher und weniger fehleranfällig werden. Außerdem werden große Regelwerke so außerdem noch etwas schneller: Für alle nicht-SSH Verbindungen muss hier im Hauptregelwerk nur noch eine Bedingung (ob Port 22) überprüft werden. Trifft diese nicht zu, wird nicht in das benutzerdefinierte Regelwerk verzweigt, es werden einige Überprüfungen eingespart.

Als nächstes wird im Firewall-Regelwerk der Zugriff auf den NTP Port (zur Zeitsynchronisation) durch die NTP Server des ZID erlaubt.

-A INPUT -p tcp -m tcp --dport 123 -j REJECT

Das Standardregelwerk weiter unten besagt, dass alle abgelehnten Pakete geloggt werden. Nun produzieren aber Windows Rechner eine große Anzahl von Verbindungen im eigenen Netzwerk, wenn sie beispielsweise nach anderen Windows Rechern suchen. Damit derartige Standardereignisse nicht die Logdateien überfüllen, werden diese Pakete nun einmal abgelehnt. Wenn sie aber einen SAMBA Server betreiben wollen, sollten Sie nachfolgende Regeln so ändern, dass der Verkehr erlaubt und nicht verworfen wird (ACCEPT statt DROP):

-A INPUT -p tcp -m tcp --dport 135 -j DROP
-A INPUT -p tcp -m tcp --dport 137:139 -j DROP
-A INPUT -p udp -m udp --dport 137:139 -j DROP
-A INPUT -p tcp -m tcp --dport 445 -j DROP
 

Die nachfolgende Zeile liefert für Port 113 (ident) zurück, dass dieser Port nicht erreichbar ist, anstatt die Pakete einfach zu verwerfen. Verwendet man dies nicht, dauern etwa FTP Verbindungsaufbauten oder das Versenden von Mail sehr lange.

-A INPUT -p tcp -m tcp --dport 113 -j REJECT

Danach wird noch der Verkehr (Broadcasts) zu DHCP Servern weggefiltert, da er zuviele Logeinträge verursachen würde. Die Broadcast DHCP Antworten werden hingegen durchgelassen - falls der Rechner DHCP verwendet, könnte er diese ja benötigen:

-A INPUT -p udp -m udp --dport 67 -j DROP
-A INPUT -p udp -m udp -d 255.255.255.255 --dport 68 -j ACCEPT

Dann folgen Beispiele, wie einzelne Ports beziehungsweise Dienste freigeschaltet werden können. Entfernen Sie jeweils die Kommentarzeichen am Beginn der Regel, um diese zu verwenden.

Verwenden Sie das erste Beispiel, wenn der Rechner Mails (von den Mail Relays der Universität, vom Mailinglistenserver etc.) empfangen soll:

 # remove the following line to accept mail from our mail relays
# -A INPUT -p tcp -m tcp -s 138.232.1.0/24 --dport 25 --syn -j ACCEPT
# -A INPUT -p tcp -m tcp -s 138.232.2.0/24 --dport 25 --syn -j ACCEPT

Das zweite Beispiel benötigen Sie, wenn Sie den TSM/ADSM Scheduler für die automatische Datensicherung am Datensicherungssystem der Universität laufen haben:

# only uncomment the following line if you have the TSM scheduler running
# -A INPUT -p tcp -m tcp -s 138.232.2.0/27 \
# -m multiport --dport 1501,1601,1701,1801,1901,2001,2101,2201,2301,2401,2501,2601 \
# --syn -j ACCEPT

(Das obige Beispiel wurde aus Platzgründen auf 3 Zeilen geschrieben. Entfernen Sie beim Auskommentieren am Ende der ersten beiden Zeile das "\" und fassen Sie die drei Zeilen zu einer zusammen.)

Das nächste Beispiel schaltet den Zugriff auf Port 80 (den HTTP Server) innerhalb der Universität frei, und im darauf folgenden Beispiel wird der Zugriff auf den FTP Server (Port 21) innerhalb der Universität Innsbruck erlaubt. Für beide Beispiele werden wieder benutzerdefinierte Regelwerke ("user-defined chain") verwendet - sehen Sie dazu das Beispiel von SSH weiter oben.

# HTTP only from uibk.ac.at
# -N USER_HTTP
# -A INPUT -p tcp -m tcp --dport 80 -j USER_HTTP
# -A INPUT -p tcp -m tcp --dport 443 -j USER_HTTP
# -A USER_HTTP -s 138.232.0.0/16 -j ACCEPT
# -A USER_HTTP -s 172.24.0.0/13 -j ACCEPT
# -A USER_HTTP -s 193.171.64.0/21 -j ACCEPT
#
# FTP only from uibk.ac.at
# -N USER_FTP
# -A INPUT -p tcp -m tcp --dport 21 --syn -j USER_FTP
# -A USER_FTP -s 138.232.0.0/16 -j ACCEPT
# -A USER_FTP -s 172.24.0.0/13 -j ACCEPT
# -A USER_FTP -s 193.171.64.0/21 -j ACCEPT

Anschließend werden noch für alle Pakete, die bisher nicht erfasst wurden, Log Einträge abgesetzt und die Pakete dann verworfen.

-A INPUT -j LOG --log-prefix "Dropping by default (INPUT)" -A INPUT -j DROP

Schließlich wird noch das „Forwarding“ verhindert. Das heißt es wird verhindert, dass der Rechner als Gateway dient (etwa wenn er mehrere Netzwerkschnittstellen hat).

-A FORWARD -j LOG --log-prefix "Attempted FORWARD!" -A FORWARD -j DROP

Damit endet unsere Beispielkonfiguration. Laden Sie diese herunter (die URL finden Sie am Beginn des Textes) und speichern Sie sie unter /etc/sysconfig/iptables und setzen Sie auf diese Datei dann strenge Zugriffsregeln:

chmod 600 /etc/sysconfig/iptables 

Wenn Sie Ihre Konfiguration vorgenommen haben, stellen Sie zuerst sicher, dass iptables aktiviert und ipchains deaktiviert sind:

 
/sbin/chkconfig ipchains off
/sbin/chkconfig iptables on

Nun können Sie Ihre neuen Firewall Regeln anwenden:

/sbin/service iptables start

Sollten Sie aktives FTP verwenden wollen, müssen Sie dazu noch ein Kernel-Modul laden, ip_conntrack_ftp. Wenn Sie außerdem NAT verwenden („Masquerading“), dann ist ein weiteres Modul notwendig, ip_nat_ftp. Dasselbe gilt für (das seltener verwendete) TFTP. Dafür sind die Module ip_conntrack_tftp beziehungsweise ip_nat_tftp notwendig. Sie können in einer Konfigurationsdatei zum Firewalling eintragen, dass diese geladen werden. Fügen Sie dazu in die Datei /etc/sysconfig/iptables-rules diese beiden Module der Variable IPTABLES_MODULES hinzu, sodass diese z.B. wie folgt aussieht:

IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp ip_conntrack_tftp"

Auf einem „normalen“ Linux Rechner (ob Desktop oder Server) sollten Sie dies eigentlich nicht benötigen. Die meisten Applikationen verwenden mittlerweile standardmäßig passives FTP. Eine Ausnahme ist hier nur wget, das standardmäßig aktives FTP verwendet. Das ist aber mit einem Eintrag in /etc/wgetrc einfach zu beheben:

passive_ftp = on

Zum Abschluss noch einmal das gesamte Regelwerk im Überblick:


########################### BEGIN ####################################
# Standard Policy fuer UIBK Linux Hosts
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

######################################################################
# allow loopback device                                                                                                                    #
######################################################################
-A INPUT -i lo -j ACCEPT

######################################################################
# SYN/FIN Scan Prevention                                                                                                              #
######################################################################
-A INPUT -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix "SYN/FIN packet"
-A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP

######################################################################
# Ping Flood Prevention                                                                                                                     #
######################################################################
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s -j ACCEPT

######################################################################
# Standard Ruleset                                                                                                                               #
######################################################################
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-N USER_SSH
-A INPUT -p tcp -m tcp --dport 22 --syn -j USER_SSH
-A USER_SSH -s 138.232.0.0/16 -j ACCEPT
-A USER_SSH -s 172.24.0.0/13 -j ACCEPT
# -A USER_SSH -s 193.171.64.0/21 -j ACCEPT

-A INPUT -p udp -m udp -s 138.232.1.0/24 --sport 123 --dport 123 -j ACCEPT

######################################################################
# drop NetBios ... traffic                                                                                                                     #
# (don't want to log all this ... uhm .. well ... )                                                                                 #
# (see default LOG+DROP below)                                                                                                  #
# CHANGE THESE LINES IF YOU WANT TO SETUP A SAMBA SERVER                   #
######################################################################
-A INPUT -p tcp -m tcp --dport 135 -j DROP
-A INPUT -p tcp -m tcp --dport 137:139 -j DROP
-A INPUT -p udp -m udp --dport 137:139 -j DROP
-A INPUT -p tcp -m tcp --dport 445 -j DROP

######################################################################
# reject ident traffic, don't drop it                                                                                                     #
######################################################################
-A INPUT -p tcp -m tcp --dport 113 -j REJECT

######################################################################
# drop DHCP packages - too much noise ...                                                                                   #
######################################################################
-A INPUT -p udp -m udp --dport 67 -j DROP
# remove the following line only if you do NOT use DHCP
-A INPUT -p udp -m udp -d 255.255.255.255 --dport 68 -j ACCEPT

######################################################################
# SMTP (mail) traffic                                                                                                                           #
######################################################################
# remove the following line to accept mail from our mail relays and other mail servers
# -A INPUT -p tcp -m tcp -s 138.232.1.0/24 --dport 25 --syn -j ACCEPT
# -A INPUT -p tcp -m tcp -s 138.232.2.0/24 --dport 25 --syn -j ACCEPT

######################################################################
# TSM/ADSM scheduler                                                                                                                    #
######################################################################
# only uncomment the following line if you have the TSM scheduler running
# -A INPUT -p tcp -m tcp -s 138.232.1.230 --dport 1501 --syn -j ACCEPT


######################################################################
# Examples of User-Defined Policies follow                                                                                 #
# If a policy restricts access to a certain namespace, then the                                                     #
# Policy should be paired with a generic REJECT                                                                       #
######################################################################
# HTTP only from uibk.ac.at
# -N USER_HTTP
# -A INPUT -p tcp -m tcp --dport 80 -j USER_HTTP
# -A INPUT -p tcp -m tcp --dport 443 -j USER_HTTP
# -A USER_HTTP -s 138.232.0.0/16 -j ACCEPT
# -A USER_HTTP -s 172.24.0.0/13 -j ACCEPT
# -A USER_HTTP -s 193.171.64.0/21 -j ACCEPT
#
# FTP only from uibk.ac.at
# -N USER_FTP
# -A INPUT -p tcp -m tcp --dport 21 --syn -j USER_FTP
# -A USER_FTP -s 138.232.0.0/16 -j ACCEPT
# -A USER_FTP -s 172.24.0.0/13 -j ACCEPT
# -A USER_FTP -s 193.171.64.0/21 -j ACCEPT
######################################################################
# finally()                                                                                                                                               #
######################################################################
-A INPUT -j LOG --log-prefix "Dropping by default (INPUT) "
-A INPUT -j DROP

######################################################################
# Prevent FORWARDing                                                                                                                  #
######################################################################
-A FORWARD -j LOG --log-prefix "Attempted FORWARD! "
-A FORWARD -j DROP
COMMIT
############################ END #####################################