iptables
Dieser Artikel oder Artikelabschnitt ist noch nicht vollständig!
Der Kernel selber hat mit 'Netfilter' einen sehr mächtigen und sicheren Paketfilter. Der Paketfilter untersucht die Pakete die deinen Rechner verlassen oder erreichen. Mit anderen Worten... er reagiert auf Netzwerkpaket je nach Art, Quelle, Ziel usw. zum Beispiel mit Zurückweisung. Das entsprechende Programm zur Steuerung des Paketfilters lautet 'iptables'.
Installation
Das Programm ist als
iptables
in core
verfügbar, und kann von dort
mittels Pacman
installiert werden.
Firewall zurücksetzen
Der Aufbau neuer Regeln sollte immer damit beginnen, alle vorhandenen Regeln zu löschen (flush):
# iptables -F
Standardverhalten festlegen
Hinweis: Die Änderungen treten sofort in Kraft!
Bei iptables Stellen alle Regeln Ausnahmen vom Standardverhalten ab. Dabei stellt man die Richtlinien OUTPUT, INPUT und FORWARD ein. Wie die Namen suggerieren, steht OUTPUT für alle ausgehenden Pakete, INPUT für alle eingehenden und FORWARD für alle Weitergeleiteten. Solange es sich nicht um eine Firewall oder einen Router handelt, sollte FORWARD auf das Verhalten DROP gesetzt werden, d.h. alle Pakete werden einfach „fallen gelassen“.
# iptables -P FORWARD DROP
Eine einfache Firewall erlaubt allen Ausgehenden Datenverkehr:
# iptables -P OUTPUT ACCEPT
Im Gegensatz dazu wird aller Eingehender Verkehr Blockiert, und nur, wenn benötigt, einzelne Ports geöffnet:
# iptables -P INPUT DROP
Einzelne Ports öffnen
In vielen Fällen kann es hilfreich sein, auch auf Desktopmaschinen mit SSH zuzugreifen. Dafür muss der Port 22 für TCP geöffnet werden:
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Zudem ist es in heterogenen Netzwerken meist erwünscht, Datenverkehr zum Sambaserver zuzulassen:
# iptables -A INPUT -p tcp --dport 139 -j ACCEPT # iptables -A INPUT -p tcp --dport 445 -j ACCEPT
Alle bereits aufgebauten Verbindungen Durchwinken
Damit nicht eingehender Verkehr, der als Antwort auf ausgehenden Verkehr erfolgte, blockiert wird, werden die entsprechenden Pakete anhand ihres Status durchgewinkt:
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Lokalen Netzwerkverkehr zulassen
Viele Systemdienste verlassen sich darauf, dass sie über die Loopback–Schnittstelle kommunizieren können. Daher sollte jeglicher Datenverkehr über die Schnittstelle lo zugelassen werden:
# iptables -A INPUT -i lo -j ACCEPT
Regeln Speichern und beim nächsten Systemstart wiederherstellen
Damit die Regeln nach dem nächsten Boot immer noch verfügbar sind, müssen die Regeln gespeichert werden:
# iptables-save >/etc/iptables/iptables.rules
Für das Laden der Regeln beim Start ist der Dienst iptables zuständig:
# systemctl enable iptables.service
(Alt) Beispielskript
Hier ein Script um iptables für einen Rechner der direkt am Internet hängt einzurichten.
#!/bin/bash #Ports: Hier eintragen welche Ports geöffnet werden sollen SERVICES_UDP="" #freigegebene UDP-Ports SERVICES_TCP="22 80" #freigegebene TCP-Ports (Hier sshd und http) #Alle vorhandenen Regeln löschen iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X #Grundregeln iptables -P OUTPUT ACCEPT iptables -P INPUT DROP iptables -P FORWARD DROP #Sicherheit iptables -N other_packets #Tabelle "other_packets" erzeugen iptables -A other_packets -p ALL -m state --state INVALID -j DROP #Kaputte Pakete verwerfen iptables -A other_packets -p icmp -m limit --limit 1/s -j ACCEPT #ICMP auf max. 1 Paket/Sekunde limitieren iptables -A other_packets -p ALL -j RETURN #Tabelle "other_packets" verlassen iptables -N service_sec #Tabelle "services_sec" erzeugen iptables -A service_sec -p tcp --syn -m limit --limit 2/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 verwerfen 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 #Tabelle "services" verlassen iptables -N reject_packets #Tabelle "reject_packets" erzeugen iptables -A reject_packets -p tcp -j REJECT --reject-with tcp-reset #TCP Pakete(Protokoll) zurückweisen iptables -A reject_packets -p udp -j REJECT --reject-with icmp-port-unreachable #UDP Pakete(Protokoll) zurückweisen iptables -A reject_packets -p icmp -j REJECT --reject-with icmp-host-unreachable #ICMP Pakete(Protokoll) zurückweisen (bei mehr als 1Paket/Sekunde [s.o.]) iptables -A reject_packets -j REJECT --reject-with icmp-proto-unreachable #Alle anderen Pakete(Protokolle) zurückweisen iptables -A reject_packets -p ALL -j RETURN #Tabelle "reject_packets" verlassen #Dienste iptables -N services #Tabelle für die Dienste erzeugen for port in $SERVICES_TCP ; do #Für jeden TCP Port (oben definiert) folgendes tun: iptables -A services -p tcp --dport $port -j service_sec #Bei Verbindungen auf TCP Port "$port in die Tabelle "services_sec" springen iptables -A services -p tcp --dport $port -j ACCEPT #Bei Verbindungen auf TCP Port "$port Verbindung zulassen done for port in $SERVICES_UDP ; do #Für jeden UDP Port (oben definiert) folgendes tun: iptables -A services -p udp --dport $port -j service_sec #Bei Verbindungen auf UDP Port "$port" in die Tabelle "services_sec" springen iptables -A services -p udp --dport $port -j ACCEPT #Bei Verbindungen auf UDP Port "$port Verbindung zulassen done iptables -A services -p ALL -j RETURN #Tabelle "services" verlassen #INPUT iptables -A INPUT -p ALL -i lo -j ACCEPT #Alle Pakete vom Loopback Interface zulassen iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT #Bereits vorhandene Verbindungen zulassen iptables -A INPUT -p ALL -j other_packets #In die Tabelle "other_packets" springen iptables -A INPUT -p ALL -j services #In die Tabelle "services" gehen iptables -A INPUT -p ALL -m limit --limit 10/s -j reject_packets #Nicht erlaubte Pakete zurückweisen, max 10Pakete/Sekunde (Tabelle "reject_Packets") iptables -A INPUT -p ALL -j DROP #Alles andere verwerfen #OUTPUT: iptables -A OUTPUT -p ALL -j ACCEPT #Ausgehende Pakete erlauben #Speichern /etc/rc.d/iptables save