Iptables für Fortgeschrittene

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der Security Sammlung.
Firewall Dienste absichern Verschlüsselung alphabetischer Security Index

Dieser Artikel ist ein Kurz-Artikel - Du kannst uns helfen, diesen zu erweitern. Klicke dazu auf bearbeiten.


bild:Iptables-logo.png

Index

bearbeiten

Bitte zuerst Iptables für Anfänger lesen. Dieser Artikel basiert auf Fall 2: Ein Netzwerk mit einem bis mehreren PCs, in dem als DSL-Router ein extra PC arbeitet.

Inhaltsverzeichnis

[Bearbeiten] Geeignetes Regelset aufstellen

IPTABLES

Bei der Erstellung einer Firewall ist es hilfreich, sich vor Augen zu führen, welche Wege die Pakete nehmen könnten und sich das auf einen Zettel notiert.

[Bearbeiten] einfaches Beispiel

Zuerst definiert man am besten ein einfaches Regelset, wie in Iptables für Anfänger beschrieben:

#!/bin/bash

## Variablen setzen
EXT_IF="ppp0" # Schnittstelle zum Internet
INT_IF="eth0" # Schnittstelle, an dem das Netzwerk hängt.
IPRANGE="192.168.0.1/24" # IP Bereich im Netzwerk

## IPv4 forwarding einschalten
echo 1 > /proc/sys/net/ipv4/ip_forward 

## Vorhandene Regeln löschen
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F

##Policys setzen
/sbin/iptables -P OUTPUT  ACCEPT
/sbin/iptables -P INPUT   DROP
/sbin/iptables -P FORWARD DROP

#INPUT (Pakete gerichtet an Router)
/sbin/iptables -A INPUT -p ALL -i lo -j ACCEPT
/sbin/iptables -A INPUT -p ALL -i $INT_IF -j ACCEPT 
/sbin/iptables -A INPUT -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -p tcp -i $EXT_IF --dport 22 -j ACCEPT #ssh
/sbin/iptables -A INPUT -p tcp -i $EXT_IF --dport 80 -j ACCEPT #http
/sbin/iptables -A INPUT -p tcp -i $EXT_IF --dport 443 -j ACCEPT #https

#OUTPUT (Pakete vom Router)
# Da Policy für OUTPUT auf ACCEPT steht, hier keine Regel nötig

#FORWARD (Pakete vom Netzwerk ins Internet oder in die andere Richtung)
/sbin/iptables -A FORWARD -p ALL -i $INT_IF -j ACCEPT
/sbin/iptables -A FORWARD -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

#POSTROUTING (Weiterleitung zwischen Netzwerk und Internet definieren
/sbin/iptables -t nat -A POSTROUTING -o $EXT_IF -s $IPRANGE -d 0/0 -j MASQUERADE

Und überprüft (z.b. mittels Portscanner) ob diese Regeln wie gewünscht funktionieren.

[Bearbeiten] fortgeschrittenes Beispiel mit Schutz vor diversen Attacken

Nun kann man sich weiter vorbewegen und weitere Regeln einfügen:

#!/bin/bash
#####################
##### Variablen #####

EXT_IF="ppp0" # Schnittstelle zum Internet
INT_IF="eth0" # Schnittstelle, an dem das Netzwerk hängt.
IPRANGE="192.168.0.1/24" # IP Bereich im Netzwerk
SERVICES_UDP="" #freigegebene UDP-Ports
SERVICES_TCP="80 443 22 21" #freigegebene TCP-Ports (hier http, https, ssh, ftp)

######################
##### Proc Stuff #####

echo 1 > /proc/sys/net/ipv4/ip_forward #IPv4 forwarding
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts #Broadcast Pings
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all #ICMP unterbinden, wenn auf 1

#####################################
##### Vorhandene Regeln löschen #####

/sbin/iptables -F #löscht alle Regeln
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -X #löscht eigene Ketten
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -X

#######################
##### Grundregeln #####

/sbin/iptables -P OUTPUT  DROP
/sbin/iptables -P INPUT   DROP
/sbin/iptables -P FORWARD DROP

###################################
##### Sicherheitsvorkehrungen #####

iptables -N bad_packets
iptables -A bad_packets -p ALL -m state --state INVALID -j DROP         #kaputte Pakete droppen
iptables -A bad_packets -p tcp -s $LAN_IP_RANGE -j REJECT --reject-with tcp-reset #Antispoofing
iptables -A bad_packets -p tcp -s $MODEM_IP_RANGE -j REJECT --reject-with tcp-reset #Antispoofing
iptables -A bad_packets -p tcp -s $FON_IP_RANGE -j REJECT --reject-with tcp-reset #Antispoofing
iptables -A bad_packets -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT #Ping Of Death (sinnvoll, wenn ICMP akzeptiert wird)
iptables -A bad_packets -p ALL -j RETURN #gibt Kontrolle zurück

iptables -N service_sec
iptables -A service_sec -p tcp --syn -m limit --limit 1/s -j ACCEPT     #SYN-Flood Attacken
iptables -A service_sec -p tcp ! --syn -m state --state NEW -j DROP     #TCP-SYN-Pakete ohne Status NEW droppen
iptables -A service_sec -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT #Portscanner ausschalten
iptables -A service_sec -p tcp --tcp-flags ALL ALL -m limit --limit 1/h -j ACCEPT #Portscanner ausschalten
iptables -A service_sec -p ALL -j RETURN #gibt Kontrolle zurück
 
################################
##### freigegebene Dienste #####

/sbin/iptables -N services
for port in $SERVICES_TCP ; do
       /sbin/iptables -A services -p tcp --dport $port -j service_sec
       /sbin/iptables -A services -p tcp --dport $port -j ACCEPT
done
for port in $SERVICES_UDP ; do
       /sbin/iptables -A services -p udp --dport $port -j service_sec
       /sbin/iptables -A services -p udp --dport $port -j ACCEPT
done
/sbin/iptables -A services -p ALL -j RETURN #gibt Kontrolle zurück an die aufrufende Kette (hier INPUT)

#################
##### INPUT #####

## aus dem Internet (ppp0)

/sbin/iptables -A INPUT -p icmp -j ACCEPT #ICMP generell akzeptieren
#sicherheit
/sbin/iptables -A INPUT -p ALL -i $EXT_IF -j bad_packets #Sicherheitsvorkehrungen
/sbin/iptables -A INPUT -p ALL -i $EXT_IF -j services #Dienste freigeben
/sbin/iptables -A INPUT -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

## aus dem Ethernet (ethX)
/sbin/iptables -A INPUT -p ALL -i $INT_IF -j ACCEPT
 
## local
/sbin/iptables -A INPUT -p ALL -i lo -j ACCEPT

##################
##### OUTPUT #####

/sbin/iptables -A OUTPUT -p ALL -j ACCEPT

###################
##### FORWARD #####

## aus dem Ethernet (ethX)
/sbin/iptables -A FORWARD -p ALL -i $INT_IF -j ACCEPT

## aus dem Internet (ppp0)
/sbin/iptables -A FORWARD -p ALL -i $EXT_IF -j bad_packets #sicherheit
/sbin/iptables -A FORWARD -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

###########################
##### NAT POSTROUTING #####

/sbin/iptables -t nat -A POSTROUTING -o ppp0 -s $LANRANGE -d 0/0 -j MASQUERADE

Wie man sieht schützt dieses Script zusätzlich vor diversen Angriffspunkten. Das ganze kann man weiter verfeinern, der Author emfielt eh, sich die Links am Ende des Artikels anzuschauen und ein Regelset von Grundauf zu schreiben.

[Bearbeiten] Siehe auch

[Bearbeiten] Quellen und externe Infos

'Persönliche Werkzeuge