Mal wieder: iptables

*cerox*

Lt. Commander
Registriert
Feb. 2005
Beiträge
1.357
Hallo zusammen,

ich habe mir jetzt mein iptables Script weiter ausgebaut.

Code:
#iptables-Script

#Module laden
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp

#Routing aktivieren
echo "1" > /proc/sys/net/ipv4/ip_forward

#TCP Syncookies aktivieren
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#RST bei vollem Buffer senden
echo "1" > /proc/sys/net/ipv4/tcp_abort_on_overflow

#TCP FIN,ACK Timeout
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

#Verbindungsaufbau nach 3 SYN-Anfragen unterbrechen
echo "3" > /proc/sys/net/ipv4/tcp_syn_retries

#Keine Redirection
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

#Kein Source-Routing
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

#ICMP Broadcasts ignorieren
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#Killt Pakete aus dem Adressraum 0.X.X.X
echo "0" > /proc/sys/net/ipv4/conf/all/bootp_relay 

#Killt gespoofte Pakete
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter 

#Alle Regeln löschen
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F DROPKETTE
iptables -X DROPKETTE

#Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Loopback-Kommunikation immer erlauben
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#Logging-Kette
iptables -N DROPKETTE
iptables -A DROPKETTE -j LOG -m limit --limit 5/s --log-prefix "INPUT-DROP:"
iptables -A DROPKETTE -j DROP

#ICMP eingehend
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-request -j ACCEPT

#ICMP ausgehend
iptables -A OUTPUT -p icmp -j ACCEPT

#Eingehende Verbindungen zulassen 
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#Ausgehende Services zulassen
iptables -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 23 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

#Registered Ports nach außen zulassen
iptables -A OUTPUT -p tcp --dport 1024:49151 -j ACCEPT
iptables -A OUTPUT -p udp --dport 1024:49151 -j ACCEPT

#Antworten bestehender Verbindungen
iptables -A INPUT -p tcp --sport 20:21 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 23 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 110 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 1024:49151 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --sport 1024:49151 -m state --state ESTABLISHED,RELATED -j ACCEPT

#Unzulässige Pakete loggen
iptables -A INPUT -j DROPKETTE
iptables -A FORWARD -j DROPKETTE
iptables -A OUTPUT -j DROPKETTE

Aufgrund von PassiveFTP, ICQ und anderen Dingen, sah ich mich gezwungen, die Registered Ports zwischen 1024 und 49151 freizugeben.

Nach innen werden diese Dienste, sofern eine Verbindung bereits besteht (die ja durch mich aufgebaut werden muss) dann zugelassen:

Code:
iptables -A INPUT -p tcp --sport 1024:49151 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --sport 1024:49151 -m state --state ESTABLISHED,RELATED -j ACCEPT

Mir kommt das alles ziehmlich unsicher vor - aber es gefällt mir immer noch besser als sowas hier, was ich in vielen Beispielen lese:

Code:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Also frage ich euch mal:

Wie kann ich das verbessern?
Wie kann die freigegebenen Portranges einschränken?

Der Paketfilter müsste doch theoretisch schonmal sicherer sein als der eines DSL-Routers, da dieser alle ausgehenden Verbindungen zulässt und deren Rückantwort, oder?
 
Die Portsituation könntest du z.b. verbessern indem du statt FTP WebDAV einsetzt. FTP ist eigentlich nicht mehr Zeitgemäß, aber ich weiß ja nicht genau wozu du es überhaupt brauchst...?
 
Also ich werde FTP auch in nächster Zeit immer wieder brauchen, um auf Webserver zugreifen zu können und da bieten viele Provider leiden auch nur FTP an.

Wie sieht es allgemein mit der Sicherheit dieses Scripts aus? Ich habe ja einige Fragen gestellt - wäre nett, wenn die jemand beantworten könnte...
 
Die iptables-Skripte sollen dein System nicht absichern, sondern den Netzwerkfluss kontrollieren.

Wenn du dein System absichern willst, musst du dich mit den installierten Diensten auseinandersetzen, denn wen interessiert ein Haus mit der Nummer 58385, wo ueberhaupt gar kein Haus steht.

Wenn dein Webserver eine Luecke hat, hilft dir deine Firewall auch nicht viel mehr, oder? Wenn dein FTP-Server eine Luecke hat, hilft dir deine Firewall dann?

Denk mal drueber nach...
 
Ja das ist mir klar.

Ich meinte mit dem Begriff sicher auch erstmal, ob wirklich alle anderen Ports dicht sind und ob das iptables-Script ansich erstmal "sicher" ist?

Das die auf den offenen Ports lauschenden Dienste abgesichert werden müssen ist mir klar.
 
Ja, sieht doch in Ordnung aus. - Brauchst du denn wirklich Routing und ICMP-Blocking? Was du noch machen koenntest ist, eine Log-Funktion einzubauen.

MfG
 
Ja Routing brauche ich.

ICMP lasse ich eingehend fast alles zu und ausgehend alles. Was ich blocke sind ICMP Nachrichten per Broadcast.
 
Du könntest anstatt zu "drop"pen "reject"en.
Dann würde sich dein Rechner RFC-konform verhalten, und anfragende Rechner müssten nicht 5 mal anfragen und auf einen Timeout waren, um festzustellen, dass keine Kommunikation erwünscht ist.

Ansonsten sieht das Skript ganz brauchbar aus.

Nur zur Sicherheit und als Randnotiz: Natürlich solltest du dir darüber im Klaren sein, dass man jede beliebige ausgehende Kommunikation durch die erlaubten Ports tunneln kann.
Um das etwas abzudichten müsstest du Zwangsproxies einsetzen, und auch die haben dann spätestens bei verschlüsseltem Verkehr (z.B. https) keine Chance mehr.
 
Du könntest anstatt zu "drop"pen "reject"en.
Dann würde sich dein Rechner RFC-konform verhalten, und anfragende Rechner müssten nicht 5 mal anfragen und auf einen Timeout waren, um festzustellen, dass keine Kommunikation erwünscht ist.

Ja, ich erinner mich - wir hatten darüber ja schon sehr ausführlich diskutiert.

Ich werde mir das noch überlegen, ob ich DROPPE oder REJECTE; wahrscheinlich werde ich es von mehreren Faktoren abhängig machen.

Ich lasse ja ausgehenden Verkehr komplett zu. Theoretisch könnte doch nun ein schädliches Programm nach außen hin eine Verbindung aufbauen - eingehende Daten zu bestehenden Verbindungen werden dann ja zugelassen. Das ist ja auch bei jedem DSL-Router der Fall, sofern er nicht modifiziert werden kann (an der Firewall).

Mit ICQ habe ich nochmal geschaut - die Kommunkation läuft immer komplett über den Server - auch beim Datentransfer. Passives FTP - das ist so ein Problem - ich habe es zur Zeit so gelöst, dass ich ausgehende Pakete zu meinem Webserver zulasse. Dadurch brauche ich auch nicht mehr die ganzen Registered Ports freigeben, was ich für unsicher halte; es sieht dadurch jetzt so aus:

Code:
#iptables-Script

#Module laden
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe iptable_nat

#Routing aktivieren
echo "1" > /proc/sys/net/ipv4/ip_forward

#TCP Syncookies aktivieren
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#RST bei vollem Buffer senden
echo "1" > /proc/sys/net/ipv4/tcp_abort_on_overflow

#TCP FIN,ACK Timeout
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

#Verbindungsaufbau nach 3 SYN-Anfragen unterbrechen
echo "3" > /proc/sys/net/ipv4/tcp_syn_retries

#Keine Redirection
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

#Kein Source-Routing
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

#ICMP Broadcasts ignorieren
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#Killt Pakete aus dem Adressraum 0.X.X.X
echo "0" > /proc/sys/net/ipv4/conf/all/bootp_relay 

#Killt gespoofte Pakete
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter 

#Alle Regeln löschen
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F DROPKETTE
iptables -X DROPKETTE

#Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Loopback-Kommunikation immer erlauben
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#Lokale Kommunikation immer erlauben
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT

#Logging-Kette
iptables -N DROPKETTE
iptables -A DROPKETTE -j LOG -m limit --limit 5/s --log-prefix "Blockiert:"
iptables -A DROPKETTE -j DROP

#ICMP eingehend
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-request -j ACCEPT

#ICMP ausgehend
iptables -A OUTPUT -p icmp -j ACCEPT

#Server-Ports freigeben
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#Ausgehende Services zulassen
iptables -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 23 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

#Antworten hergestellter Verbindungen
iptables -A INPUT -p tcp --sport 20:21 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 23 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 110 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT

#ICQ
iptables -A OUTPUT -p tcp --dport 5190 -j ACCEPT
iptables -A INPUT -p tcp --sport 5190 -j ACCEPT

#Passives FTP mit folgenden Servern zulassen
iptables -A OUTPUT -p tcp -d 83.133.51.34 --dport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp -s 83.133.51.34 --sport 1024:65535 -j ACCEPT

#Unzulässige Pakete loggen
iptables -A INPUT -j DROPKETTE
iptables -A FORWARD -j DROPKETTE
iptables -A OUTPUT -j DROPKETTE
 
Zuletzt bearbeitet:
*cerox* schrieb:
Ja, ich erinner mich - wir hatten darüber ja schon sehr ausführlich diskutiert.

Ich persönlich(!) würde Anfragen an die typischen Filesharing-/Wurmports(135,4662,6881,...) DROPen, und alles andere REJECTen, um keine legitime Kommunikation zu stören.

Ich lasse ja ausgehenden Verkehr komplett zu. Theoretisch könnte doch nun ein schädliches Programm nach außen hin eine Verbindung aufbauen - eingehende Daten zu bestehenden Verbindungen werden dann ja zugelassen.

Korrekt. Sobald jemand "Böses" in deinem Netzwerk sitzt, hast du verloren. Du kannst ihm das Leben mit restriktiven iptables-Regeln oder vorgelagerten Zwangsproxies erschweren, aber du kannst ein Tunneln nie verhindern, solange normale Kommunikation noch funktionieren soll.

Wenn du paranoid genug bist, würde ich dir Tripwire o.Ä. zum Überprüfen von Veränderungen am System, ein vorgeschaltetes SNORT als IDS und eventl. ein "hardened" Linux empfehlen. Wobei letzteres normales Arbeiten oftmals empfindlich behindert.
Der "Normalmensch" braucht sowas aber im Normalfall eher nicht.
 
Wenn du paranoid genug bist, würde ich dir Tripwire o.Ä. zum Überprüfen von Veränderungen am System, ein vorgeschaltetes SNORT als IDS und eventl. ein "hardened" Linux empfehlen. Wobei letzteres normales Arbeiten oftmals empfindlich behindert.
Der "Normalmensch" braucht sowas aber im Normalfall eher nicht.

Ja, über den Einsatz von Snort habe ich mal nachgedacht; erkennt Snort denn auch Portscans und kann diese dann verhindern (z.B. indem es eine bestimmte IP Adresse für einen bestimmten Zeitraum aussperrt)?
 
Ok, und wie siehts mit meinem zuletzt geposteten abgeänderten iptables Script aus? Das sollte doch eigentlich sehr sicher sein oder nicht (ich meine nur das iptables Script ansich)?
 
Das Skript an sich hat meiner Ansicht nach keine direkten Fehler.

Über die Sicherheit des Gesamtsystems lässt sich daraus allerdings kaum etwas sagen.

Iptables ist nur ein kleiner Baustein in einem Gesamtkonzept. Vor Konfigurationsfehlern der Serverdienste, fehlenden Patches, versehentlichem Ausführen von Schadcode,... kann es dich logischerweise nicht schützen.
 
Iptables ist nur ein kleiner Baustein in einem Gesamtkonzept. Vor Konfigurationsfehlern der Serverdienste, fehlenden Patches, versehentlichem Ausführen von Schadcode,... kann es dich logischerweise nicht schützen.

Ja, das ist mir klar. Ich muss logischerweise nur irgendwo anfangen und somit habe ich dann schonmal diesen Teil des Sicherheitskonzeptes.

Danke für eure Hilfe. Ich denke der Thread hat sich damit erledigt.
 
Zurück
Oben