Im Katalog suchen

Linux - Wegweiser für Netzwerker

Online-Version

Copyright © 2001 by O'Reilly Verlag GmbH & Co.KG

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches Linux - Wegweiser für Netzwerker oder wollen Sie es bestellen, dann klicken Sie bitte hier.


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel



Beispiel einer Firewall-Konfiguration

Wir haben nun ausführlich die Grundlagen der Firewall-Konfiguration besprochen. Nun sehen wir uns mal an, wie eine tatsächliche Firewall-Konfiguration aussehen könnte.

Die Konfiguration in diesem Beispiel wurde so entworfen, daß sie leicht erweitert und angepaßt werden kann. Wir stellen hier drei Versionen zur Verfügung. Die erste Version wurde mit ipfwadm implementiert (oder mit dem ipfwadm-wrapper-Skript). Die zweite Version ist für ipchains geschrieben, und die dritte Version benutzt iptables. Das Beispiel versucht nicht, alle Möglichkeiten benutzerdefinierter Ketten auszuschöpfen, zeigt Ihnen aber die Ähnlichkeiten und Unterschiede zwischen den Sprachstilen der alten und neuen Firewall-Konfigurations-Tools:

#!/bin/bash 
########################################################################## 
# IPFWADM-VERSION 
# Dieses Beispiel ist eine Firewall-Konfiguration für einen einzelnen Host. 
# Der Firewall-Rechner stellt keine Netzwerkdienste zur Verfügung. 
##########################################################################  
# BEGINN DER BENUTZERKONFIGURATION  
# Der Name und Ort des ipfwadm-Programms. Verwenden Sie ipfwadm-wrapper 
# für 2.2.*-Kernel. 
IPFWADM=ipfwadm  

# Pfad zur ausführbaren ipfwadm-Datei. 
PATH="/sbin"  
# Unser interner Netzwerkadreßraum und die Schnittstelle dafür. 
OURNET="172.29.16.0/24" 
OURBCAST="172.29.16.255" 
OURDEV="eth0"  

# Die externe Adresse und die Schnittstelle dafür. 
ANYADDR="0/0" 
ANYDEV="eth1"  

# Die TCP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Ports 
# Achtung: durch Leerzeichen getrennt 
TCPIN="smtp www" 
TCPOUT="smtp www ftp ftp-data irc"  

# Die UDP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Ports 
# Achtung: durch Leerzeichen getrennt 
UDPIN="domain" 
UDPOUT="domain"  

# Die ICMP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Typen 
# Siehe /usr/include/netinet/ip_icmp.h für Typnummern 
# Achtung: durch Leerzeichen getrennt 
ICMPIN="0 3 11" 
ICMPOUT="8 3 11"  

# Protokollierung. Entfernen Sie das Kommentarzeichen, um die Protokol- 
# lierung von Datagrammen zu aktivieren, die von der Firewall blockiert werden. 
# LOGGING=1  

# ENDE DER BENUTZERKONFIGURATION 
########################################################################### 
# Löschen aller Regeln in der Eingangs-Tabelle. 
$IPFWADM -I -f  

# Eingehende Zugriffe wehren wir standardmäßig ab. 
$IPFWADM -I -p deny 

# SPOOFING 
# Wir sollten keine Datagramme von außen akzeptieren, deren Quelladresse 
# zu unserem Netzwerk gehört, also blockieren wir sie. 
$IPFWADM -I -a deny -S $OURNET -W $ANYDEV  

# SMURF 
# Wir verbieten ICMP zu unserer Broadcast-Adresse, um "Smurf"-artige 
# Attacken zu verhindern. 
$IPFWADM -I -a deny -P icmp -W $ANYDEV -D $OURBCAST  

# TCP 
# Wir akzeptieren alle TCP-Datagramme, die zu einer existierenden 
# Verbindung gehören (d.h. deren ACK-Bit gesetzt ist), für Ports, zu denen 
# wir Durchgang gewähren. 
# Das sollte auf mehr als 95% aller gültigen TCP-Pakete zutreffen. 
$IPFWADM -I -a accept -P tcp -D $OURNET $TCPIN -k -b  

# TCP - EINGEHENDE VERBINDUNGEN 
# Wir akzeptieren Verbindungsanfragen von der Außenwelt nur an den 
# erlaubten Ports. 
$IPFWADM -I -a accept -P tcp -W $ANYDEV -D $OURNET $TCPIN -y  

# TCP - AUSGEHENDE VERBINDUNGEN 
# Wir gestatten alle ausgehenden TCP-Verbindungsanforderungen 
# an erlaubten TCP-Ports. 
$IPFWADM -I -a accept -P tcp -W $OURDEV -D $ANYADDR $TCPOUT -y  

# UDP - EINGEHEND 
# Wir akzeptieren eingehende UDP-Datagramme an den erlaubten Ports. 
$IPFWADM -I -a accept -P udp -W $ANYDEV -D $OURNET $UDPIN  

# UDP - AUSGEHEND 
# Wir gestatten ausgehende UDP-Datagramme an den erlaubten Ports. 
$IPFWADM -I -a accept -P udp -W $OURDEV -D $ANYADDR $UDPOUT  

# ICMP - EINGEHEND 
# Wir akzeptieren eingehende ICMP-Datagramme der erlaubten Typen. 
$IPFWADM -I -a accept -P icmp -W $ANYDEV -D $OURNET $UDPIN  

# ICMP - AUSGEHEND 
# Wir gestatten ausgehende ICMP-Datagramme der erlaubten Typen. 
$IPFWADM -I -a accept -P icmp -W $OURDEV -D $ANYADDR $UDPOUT  

# DEFAULT und LOGGING 
# Alle verbleibenden Datagramme werden an die Standardregel durch- 
# gereicht und verworfen. Sie werden protokolliert, falls Sie die 
# oben beschriebene LOGGING-Variable entsprechend konfiguriert haben. 
# 
if [ "$LOGGING" ] 
then 
  # Abgewiesenes TCP protokollieren 
  $IPFWADM -I -a reject -P tcp -o 
  # Abgewiesenes UDP protokollieren 
  $IPFWADM -I -a reject -P udp -o 
  # Abgewiesenes ICMP protokollieren 
  $IPFWADM -I -a reject -P icmp -o 
fi 
# 
# end.

Nun implementieren wir dieses Beispiel noch einmal mit dem ipchains-Befehl:

#!/bin/bash 
########################################################################## 
# IPCHAINS-VERSION 
# Dieses Beispiel ist eine Firewall-Konfiguration für einen einzelnen Host. 
# Der Firewall-Rechner stellt keine Netzwerkdienste zur Verfügung. 
##########################################################################  

# BEGINN DER BENUTZERKONFIGURATION  

# Name und Ort des ipchains-Programms. 
IPCHAINS=ipchains  

# Pfad zur ausführbaren ipchains-Datei. 
PATH="/sbin"  

# Unser interner Netzwerkadreßraum und die Schnittstelle dafür. 
OURNET="172.29.16.0/24" 
OURBCAST="172.29.16.255" 
OURDEV="eth0"  

# Die externe Adresse und die Schnittstelle dafür. 
ANYADDR="0/0" 
ANYDEV="eth1"  

# Die TCP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Ports 
# Achtung: durch Leerzeichen getrennt 
TCPIN="smtp www" 
TCPOUT="smtp www ftp ftp-data irc"  

# Die UDP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Ports 
# Achtung: durch Leerzeichen getrennt 
UDPIN="domain" 
UDPOUT="domain"  

# Die ICMP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Typen 
# Siehe /usr/include/netinet/ip_icmp.h für Typnummern 
# Achtung: durch Leerzeichen getrennt 
ICMPIN="0 3 11" 
ICMPOUT="8 3 11"  

# Protokollierung. Entfernen Sie das Kommentarzeichen, um die Protokol- 
# lierung von Datagrammen zu aktivieren, die von der Firewall blockiert werden. 
# LOGGING=1  

# ENDE DER BENUTZERKONFIGURATION 
########################################################################## 
# Löschen aller Regeln in der Eingangs-Tabelle. 
$IPCHAINS -F input  

# Eingehende Zugriffe wehren wir standardmäßig ab. 
$IPCHAINS -P input deny  

# SPOOFING 
# Wir sollten keine Datagramme von außen akzeptieren, deren Quelladresse 
# zu unserem Netzwerk gehört, also blockieren wir sie. 
$IPCHAINS -A input -s $OURNET -i $ANYDEV -j deny  

# SMURF 
# Wir verbieten ICMP zu unserer Broadcast-Adresse, um "Smurf"-artige 
# Attacken zu verhindern. 
$IPCHAINS -A input -p icmp -w $ANYDEV -d $OURBCAST -j deny  

# Fragmente sollten wir akzeptieren. In ipchains müssen wir das 
# explizit verlangen. 
$IPCHAINS -A input -f -j accept  

# TCP 
# Wir akzeptieren alle TCP-Datagramme, die zu einer existierenden 
# Verbindung gehören (d.h. deren ACK-Bit gesetzt ist), für Ports, zu denen 
# wir Durchgang gewähren. 
# Das sollte auf mehr als 95% aller gültigen TCP-Pakete zutreffen. 
$IPCHAINS -A input -p tcp -d $OURNET $TCPIN ! -y -b -j accept  

# TCP - EINGEHENDE VERBINDUNGEN 
# Wir akzeptieren Verbindungsanfragen von der Außenwelt nur an den 
# erlaubten Ports. 
$IPCHAINS -A input -p tcp -i $ANYDEV -d $OURNET $TCPIN -y -j accept  

# TCP - AUSGEHENDE VERBINDUNGEN 
# Wir gestatten alle ausgehenden TCP-Verbindungsanforderungen 
# an erlaubten TCP-Ports. 
$IPCHAINS -A input -p tcp -i $OURDEV -d $ANYADDR $TCPOUT -y -j accept  

# UDP - EINGEHEND 
# Wir akzeptieren eingehende UDP-Datagramme an den erlaubten Ports. 
$IPCHAINS -A input -p udp -i $ANYDEV -d $OURNET $UDPIN -j accept  

# UDP - AUSGEHEND 
# Wir gestatten ausgehende UDP-Datagramme an den erlaubten Ports. 
$IPCHAINS -A input -p udp -i $OURDEV -d $ANYADDR $UDPOUT -j accept  

# ICMP - EINGEHEND 
# Wir akzeptieren eingehende ICMP-Datagramme der erlaubten Typen. 
$IPCHAINS -A input -p icmp -w $ANYDEV -d $OURNET $UDPIN -j accept  

# ICMP - AUSGEHEND 
# Wir gestatten ausgehende ICMP-Datagramme der erlaubten Typen. 
$IPCHAINS -A input -p icmp -i $OURDEV -d $ANYADDR $UDPOUT -j accept  

# DEFAULT und LOGGING 
# Alle verbleibenden Datagramme werden an die Standardregel durch- 
# gereicht und verworfen. Sie werden protokolliert, falls Sie die 
# oben beschriebene LOGGING-Variable entsprechend konfiguriert haben. 
# 
if [ "$LOGGING" ] 
then i
  # Abgewiesenes TCP protokollieren 
  $IPCHAINS -A input -p tcp -l -j reject 

  # Abgewiesenes UDP protokollieren 
  $IPCHAINS -A input -p udp -l -j reject 

  # Abgewiesenes ICMP protokollieren i
  $IPCHAINS -A input -p icmp -l -j reject  

fi 
# 
# end.

Aufgrund des Unterschieds in der Bedeutung der INPUT-Regelsätze in der netfilter-Implementierung gingen wir in unserem iptables-Beispiel dazu über, FORWARD-Regelsätzen zu benutzen. Das hat Konsequenzen für uns, denn es bedeutet, daß keine der Regeln den Firewall-Host selbst schützen. Um unser ipchains-Beispiel akkurat nachzubilden, würden wir hier alle unsere Regeln in der INPUT-Kette replizieren. Um die Sache klarzustellen: Wir verwerfen statt dessen alle eingehenden Datagramme, die wir von unserer Außenschnittstelle erhalten.


#!/bin/bash 
########################################################################## 
# IPTABLES-VERSION 
# Dieses Beispiel ist eine Firewall-Konfiguration für einen einzelnen Host. 
# Der Firewall-Rechner stellt keine Netzwerkdienste zur Verfügung. 
##########################################################################  

# BEGINN DER BENUTZERKONFIGURATION  

# Name und Ort des iptables-Programms. 
IPTABLES=iptables  

# Pfad zur ausführbaren iptables-Datei. 
PATH="/sbin"  

# Unser interner Netzwerkadreßraum und die Schnittstelle dafür. 
OURNET="172.29.16.0/24" 
OURBCAST="172.29.16.255" 
OURDEV="eth0"  

# Die externe Adresse und die Schnittstelle dafür. 
ANYADDR="0/0" 
ANYDEV="eth1"  

# Die TCP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Ports 
# Achtung: durch Leerzeichen getrennt 

TCPIN="smtp,www" 
TCPOUT="smtp,www,ftp,ftp-data,irc"  

# Die UDP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Ports 
# Achtung: durch Leerzeichen getrennt 
UDPIN="domain" UDPOUT="domain"  

# Die ICMP-Dienste, die wir erlauben wollen - "" leer bedeutet: alle Typen 
# Siehe /usr/include/netinet/ip_icmp.h für Typnummern 
# Achtung: durch Leerzeichen getrennt 
ICMPIN="0,3,11" 
ICMPOUT="8,3,11"  

# Protokollierung. Entfernen Sie das Kommentarzeichen, um die Protokol- 
# lierung von Datagrammen zu aktivieren, die von der Firewall blockiert werden. 
# LOGGING=1  

# ENDE DER BENUTZERKONFIGURATION 
########################################################################### 
# Löschen aller Regeln in der Eingangs-Tabelle. 
$IPTABLES -F FORWARD  

# Eingehende Zugriffe wehren wir standardmäßig ab. 
$IPTABLES -P FORWARD deny  

# Von außen kommende Datagramme für diesen Host wehren wir ab. 
$IPTABLES -A INPUT -i $ANYDEV -j DROP  

# SPOOFING 
# Wir sollten keine Datagramme von außen akzeptieren, deren Quelladresse 
# zu unserem Netzwerk gehört, also blockieren wir sie. 
$IPTABLES -A FORWARD -s $OURNET -i $ANYDEV -j DROP  

# SMURF 
# Wir verbieten ICMP zu unserer Broadcast-Adresse, um "Smurf"-artige 
# Attacken zu verhindern. 
$IPTABLES -A FORWARD -m multiport -p icmp -i $ANYDEV -d $OURNET -j DENY  

# Fragmente sollten wir akzeptieren. In iptables müssen wir das 
# explizit verlangen. 
$IPTABLES -A FORWARD -f -j ACCEPT  

# TCP 
# Wir akzeptieren alle TCP-Datagramme, die zu einer existierenden 
# Verbindung gehören (d.h. deren ACK-Bit gesetzt ist), für Ports, zu denen 
# wir Durchgang gewähren. 
# Das sollte auf mehr als 95% aller gültigen TCP-Pakete zutreffen. 
$IPTABLES -A FORWARD -m multiport -p tcp -d $OURNET --dports $TCPIN / 
     ! --tcp-flags SYN,ACK ACK -j ACCEPT 
$IPTABLES -A FORWARD -m multiport -p tcp -s $OURNET --sports $TCPIN / 
     ! --tcp-flags SYN,ACK ACK -j ACCEPT 

# TCP - EINGEHENDE VERBINDUNGEN 
# Wir akzeptieren Verbindungsanfragen von der Außenwelt nur an den 
# erlaubten Ports. 
$IPTABLES -A FORWARD -m multiport -p tcp -i $ANYDEV -d $OURNET $TCPIN / 
    --syn -j ACCEPT  

# TCP - AUSGEHENDE VERBINDUNGEN 
# Wir gestatten alle ausgehenden TCP-Verbindungsanforderungen 
# an erlaubten TCP-Ports. 
$IPTABLES -A FORWARD -m multiport -p tcp -i $OURDEV -d $ANYADDR / 
    --dports $TCPOUT --syn -j ACCEPT  

# UDP - EINGEHEND 
# Wir akzeptieren eingehende UDP-Datagramme an den erlaubten 
# Ports und umgekehrt. 
$IPTABLES -A FORWARD -m multiport -p udp -i $ANYDEV -d $OURNET / 
    --dports $UDPIN -j ACCEPT 
$IPTABLES -A FORWARD -m multiport -p udp -i $ANYDEV -s $OURNET / 
    --sports $UDPIN -j ACCEPT  

# UDP - AUSGEHEND 
# Wir gestatten ausgehende UDP-Datagramme an den erlaubten Ports 
# und umgekehrt. 
$IPTABLES -A FORWARD -m multiport -p udp -i $OURDEV -d $ANYADDR / 
    --dports $UDPOUT -j ACCEPT 
$IPTABLES -A FORWARD -m multiport -p udp -i $OURDEV -s $ANYADDR / 
    --sports $UDPOUT -j ACCEPT  

# ICMP - EINGEHEND 
# Wir erlauben eingehende ICMP-Datagramme der erlaubten Typen. 
$IPTABLES -A FORWARD -m multiport -p icmp -i $ANYDEV -d $OURNET / 
    --dports $ICMPIN -j ACCEPT  

# ICMP - AUSGEHEND 
# Wir gestatten ausgehende ICMP-Datagramme der erlaubten Typen. 
$IPTABLES -A FORWARD -m multiport -p icmp -i $OURDEV -d $ANYADDR / 
    --dports $ICMPOUT -j ACCEPT  

# DEFAULT und LOGGING 
# Alle verbleibenden Datagramme werden an die Standardregel durch- 
# gereicht und verworfen. Sie werden protokolliert, falls Sie die 
# oben beschriebene LOGGING-Variable entsprechend konfiguriert haben. 
# 
if [ "$LOGGING" ] 
then 
  # Abgewiesenes TCP protokollieren 
  $IPTABLES -A FORWARD -m tcp -p tcp -j LOG 

  # Abgewiesenes UDP protokollieren 
  $IPTABLES -A FORWARD -m udp -p udp -j LOG 

  # Abgewiesenes ICMP protokollieren 
  $IPTABLES -A FORWARD -m udp -p icmp -j LOG 
fi 
# 
# end.

In vielen einfachen Situationen ist alles, was Sie zu tun haben, den oberen Abschnitt, der mit “BENUTZERKONFIGURATION” bezeichnet ist, zu editieren, um festzulegen, welche Protokolle und Datagrammtypen Sie herein- und herauslassen wollen. Für komplexere Konfigurationen müssen Sie auch den unteren Abschnitt editieren. Denken Sie daran, dies ist ein bewußt einfach gehaltenes Beispiel. Studieren Sie es also sehr sorgfältig, um sicherzugehen, daß es auch immer das macht, was Sie wollen.





vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel


Weitere Informationen zum Linux - Wegweiser für Netzwerker

Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center


O'Reilly Home|O'Reilly-Partnerbuchhandlungen|Bestellinformationen
Kontakt|Über O'Reilly|Datenschutz

© 2001, O'Reilly Verlag