Iptables: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Kn3cHt (Diskussion | Beiträge)
Script hinzugefügt
KKeine Bearbeitungszusammenfassung
 
(23 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''iptables'''
{{überholt|[[nftables]]}}{{unvollständig}}{{SEITENTITEL:iptables}}
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|repo=core|paket=iptables}}
 
== 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


Der Kernel selber hat mit 'Netfilter' einen sehr mächtigen und sicheren Paketfilter. Der Paketfilter untersucht die Paket die deinen Rechner verlassen, oder erreichen. Mit anderen Worten... er reagiert auf Netzwerkpaket je nach Art, Quelle, Ziel usw. zum Beispiel mit Zurückweisung.
Eine einfache Firewall erlaubt allen Ausgehenden Datenverkehr:
Das entsprechende Programm zur Steuerung des Paketfilters lautet 'iptables'.
 
  # 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 ==


Das entsprechende Paket wird mittels folgendem Aufruf installiert.
Viele Systemdienste verlassen sich darauf, dass sie über die Loopback–Schnittstelle kommunizieren können. Daher sollte jeglicher Datenverkehr über die Schnittstelle lo zugelassen werden:


   # pacman -S iptables
   # iptables -A INPUT -i lo -j ACCEPT


Definiere ein paar Regeln, und starte ''/etc/rc.d/iptables save'' Das Script ruft 'iptables-save' auf, und speichert Deine erstellten Regeln in ''/etc/iptables/iptables.rules''.
== Regeln Speichern und beim nächsten Systemstart wiederherstellen ==


Jetzt kannst Du iptables starten.
Damit die Regeln nach dem nächsten Boot immer noch verfügbar sind, müssen die Regeln gespeichert werden:


   # /etc/rc.d/iptables start
   # iptables-save >/etc/iptables/iptables.rules


Das Script ruft ''iptables-restore'' auf, und lädt Deine Regeln.
Für das Laden der Regeln beim Start ist der Dienst iptables zuständig:
Du kannst die Firewall natürlich im DAEMONS Feld in ''/etc/rc.conf'' eintragen, damit es nach jedem boot automatisch geladen wird.


   # DAEMONS=(...'''iptables''' network...)
   # systemctl enable iptables.service




== (Alt) Beispielskript ==
Hier ein Script um iptables für einen Rechner der direkt am Internet hängt einzurichten.
Hier ein Script um iptables für einen Rechner der direkt am Internet hängt einzurichten.


Zeile 28: Zeile 68:
   SERVICES_TCP="22 80" #freigegebene TCP-Ports (Hier sshd und http)
   SERVICES_TCP="22 80" #freigegebene TCP-Ports (Hier sshd und http)
    
    
  #Alle vorhandenen Regeln löschen
#Alle vorhandenen Regeln löschen
  iptables -F
iptables -F
  iptables -t nat -F
iptables -t nat -F
  iptables -t mangle -F
iptables -t mangle -F
  iptables -X
iptables -X
  iptables -t nat -X
iptables -t nat -X
  iptables -t mangle -X
iptables -t mangle -X
 
  #Grundregeln
#Grundregeln
  iptables -P OUTPUT  ACCEPT
iptables -P OUTPUT  ACCEPT
  iptables -P INPUT  DROP
iptables -P INPUT  DROP
  iptables -P FORWARD DROP
iptables -P FORWARD DROP
 
  #Sicherheit
#Sicherheit
  iptables -N bad_packets
iptables -N other_packets #Tabelle "other_packets" erzeugen
  iptables -A bad_packets -p ALL -m state --state INVALID -j DROP                         #kaputte Pakete droppen
iptables -A other_packets -p ALL -m state --state INVALID -j DROP #Kaputte Pakete verwerfen
  iptables -A bad_packets -p tcp -j REJECT --reject-with tcp-reset                        #Antispoofing
iptables -A other_packets -p icmp -m limit --limit 1/s -j ACCEPT #ICMP auf max. 1 Paket/Sekunde limitieren
  iptables -A bad_packets -p udp -j REJECT --reject-with icmp-port-unreachable            #Antispoofing
iptables -A other_packets -p ALL -j RETURN #Tabelle "other_packets" verlassen
  iptables -A bad_packets -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT #Ping Of Death
  iptables -A bad_packets -p ALL -j RETURN
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 -N service_sec
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 --syn -m limit --limit 1/s -j ACCEPT                     #SYN-Flood Attacken
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 ! --syn -m state --state NEW -j DROP                     #TCP-SYN-Pakete ohne Status NEW droppen
iptables -A service_sec -p tcp --tcp-flags ALL ALL -m limit --limit 1/h -j ACCEPT #Portscanner ausschalten
  iptables -A service_sec -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT       #Portscanner ausschalten
iptables -A service_sec -p ALL -j RETURN #Tabelle "services" verlassen
  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
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
  #Dienste
iptables -A reject_packets -p udp -j REJECT --reject-with icmp-port-unreachable #UDP Pakete(Protokoll) zurückweisen
  iptables -N services
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.])
  for port in $SERVICES_TCP ; do
iptables -A reject_packets -j REJECT --reject-with icmp-proto-unreachable #Alle anderen Pakete(Protokolle) zurückweisen
        iptables -A services -p tcp --dport $port -j service_sec
iptables -A reject_packets -p ALL -j RETURN #Tabelle "reject_packets" verlassen
        iptables -A services -p tcp --dport $port -j ACCEPT
  done
#Dienste
  for port in $SERVICES_UDP ; do
iptables -N services #Tabelle für die Dienste erzeugen
        iptables -A services -p udp --dport $port -j service_sec
for port in $SERVICES_TCP ; do #Für jeden TCP Port (oben definiert) folgendes tun:
        iptables -A services -p udp --dport $port -j ACCEPT
        iptables -A services -p tcp --dport $port -j service_sec #Bei Verbindungen auf TCP Port "$port in die Tabelle "services_sec" springen
  done
        iptables -A services -p tcp --dport $port -j ACCEPT #Bei Verbindungen auf TCP Port "$port Verbindung zulassen
  iptables -A services -p ALL -j RETURN
done
 
for port in $SERVICES_UDP ; do #Für jeden UDP Port (oben definiert) folgendes tun:
  #INPUT
        iptables -A services -p udp --dport $port -j service_sec #Bei Verbindungen auf UDP Port "$port" in die Tabelle "services_sec" springen
  iptables -A INPUT -p ALL -i lo -j ACCEPT
        iptables -A services -p udp --dport $port -j ACCEPT #Bei Verbindungen auf UDP Port "$port Verbindung zulassen
  iptables -A INPUT -p icmp -j ACCEPT
done
  iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A services -p ALL -j RETURN #Tabelle "services" verlassen
  iptables -A INPUT -p ALL -j services
  iptables -A INPUT -p ALL -j bad_packets
#INPUT
 
iptables -A INPUT -p ALL -i lo -j ACCEPT #Alle Pakete vom Loopback Interface zulassen
  #OUTPUT: Alles was raus geht wird erlaubt
iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT #Bereits vorhandene Verbindungen zulassen
  iptables -A OUTPUT -p ALL -j ACCEPT
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
  #Speichern
iptables -A INPUT -p ALL -m limit --limit 10/s -j reject_packets #Nicht erlaubte Pakete zurückweisen, max 10Pakete/Sekunde (Tabelle "reject_Packets")
  /etc/rc.d/iptables save
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  




'''Weitere Quellen'''
== Weblinks ==


* [http://www.pl-berichte.de/work/firewall/fire1.html#2.1 Grundlagen Firewall]
* [https://netfilter.org/documentation/index.html#documentation-howto netfilter/iptables HOWTO]{{sprache|en}}
* [http://netfilter.org/documentation/index.html#documentation-howto netfilter/iptables HOWTO]
* [https://www.selflinux.org/selflinux/html/iptables.html iptables auf SelfLinux]{{sprache|de}}
* [http://www.selflinux.org/selflinux/html/iptables.html iptables auf SelfLinux]


[[Kategorie:Sicherheit]]
[[Kategorie:Sicherheit]]
[[Kategorie:Unvollständig]]
[[Kategorie:Netzwerk]]
[[en:iptables]]
[[es:Iptables]]
[[fr:Iptables]]
[[it:Iptables]]
[[ja:Iptables]]
[[ru:Iptables]]
[[sr:Iptables]]
[[zh-CN:Iptables]]

Aktuelle Version vom 27. Mai 2022, 09:26 Uhr

Dieser Artikel behandelt ein Programm oder ein Vorgehen, das durch nftables überholt wurde.


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.

pacman -S iptables

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 


Weblinks