Probleme mit iptables Script

Alles rund um Netzwerktechnik und Protokolle
xterm
Posts: 2
Joined: 2009-06-17 08:35

Probleme mit iptables Script

Post by xterm »

Hallo Liebe Comunity,

Ich bin neu hier und habe mich angemeldet weil ich selber kein rat mehr weis.
Es ist so ich bin Technick Admin von nem kleinen vps server

Code: Select all

 CPU: 2Ghz 2x 
 RAM: 2GB 
 HDD: 10GB
 Anbindung: 100mbit
 OS: Debian 
Es ist nicht so das ich keine erfahrung im Umgang mit Linux habe(Setzte es privat selber ein unteranderem auch auf meinem HomeServer)
auch habe ich mich schon des längerem mit iptables und der suche von google befast und baue ständich mein wissen aus.

Jedoch habe ich ein problem mit meinem neuen packetfilter. Sobald dieser geladen ist bekomme ich oft timeouts vom server
die erst nach einem erneuten laden der jeweiligen webseite auf dem vps verschwindet und dan einige zeit ohne timeout leuft.

Das Problem taucht sowohl als auch ohne last auf.
Wir haben am tag ca. 300-400 views und durchschnitlich 30-50 kleichzeitich angemeldete User Online.
Als Forensoftware kompt ein vBulletin zum einsatz. PHP wurde mit Suhosin v0.9.12 gehärtet desweiteren is ein APC(Alternative PHP Cache) installiert.
PHP und MySQL befindet sich in der Version 5.2.x-x.

Das system selber ist rundum gut abgesichert und ich halte es stäts uptodate bis auf den kernel da dieser beim vps vom hoster festgelegt würd *leider*
Verzichte auf Dienste wie fail2ban oder Denyhost , sicher den SSH bsp durch Keyfile und root verbot + port verschoben und an ip-range meines ips gebunden.
sowie auf zweite netzwerkschnitstelle gebunden die für die user unbekant ist.

Wie gesargt das problem taucht aufem ganzen server auf bsp ssh / ts2 / webserver und das auch zu zeiten wo kein bedrieb ist!

Code: Select all

uname -r 

Code: Select all

2.6.18-92.1.18.el5.028stab060.2
Das besargte Script um das es geht:

Code: Select all

#!/bin/sh
# Lege pfard zu iptables fest
# iptables = /sbin/iptables

# Lese zu Blockende ip's ein
 BADIPS="$(cat /root/allbadips.txt|grep -v -E "^#")"

case "$1" in
   start)
     echo "Starte Firewall..."

    # Alle bestehenden Regeln loeschen
       iptables -F
       iptables -X
    # Setze Default Policy
       iptables -P INPUT   DROP
       iptables -P OUTPUT  DROP
       iptables -P FORWARD DROP
    # Ueber Loopback alles erlauben
        iptables -I INPUT  -i lo -j ACCEPT
        iptables -I OUTPUT -o lo -j ACCEPT

    # Max. Anzahl der Verbindungen die gehalten werden können.
       echo "4096" > /proc/sys/net/ipv4/ip_conntrack_max


  # Erlaube traffic zwischen lo und venet0
    iptables -A INPUT  -i venet0 -s 127.0.0.1   -j ACCEPT
    iptables -A OUTPUT -o venet0 -d 127.0.0.1   -j ACCEPT
    iptables -A INPUT  -i lo -s 127.0.0.1       -j ACCEPT 
    iptables -A OUTPUT -o lo -d 127.0.0.1       -j ACCEPT

 # Connection-Tracking aktivieren  
    iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT  -m state --state ESTABLISHED,RELATED     -j ACCEPT
 
  #Blocke alle ip's die in /root/allbadips.txt stehen!
   for ip in $BADIPS
    do
     iptables -A INPUT -s $ip -j DROP
     iptables -A OUTPUT -d $ip -j DROP
   done

 # SYN-Flood Protect
  iptables -N syn-flood
  iptables -A INPUT -p tcp --syn -j syn-flood
  iptables -A syn-flood -m limit --limit 1/s --limit-burst 3 -j RETURN
  iptables -A syn-flood -j DROP

 # Schütze SSH-Port gegen SYN Attacken(9986)
   iptables -A INPUT -p tcp --syn --dport 9986 -j ACCEPT
   iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT
   iptables -A INPUT -p tcp --syn -j DROP

 # Port-Scan Protect
  iptables -N portscan
  iptables -A portscan -m limit --limit 1/sec --limit-burst 2 -j RETURN 
  iptables -A portscan -m limit -j LOG --log-prefix "iptables scanned: " 

 # Schutz vor IP Stealth Scans                                                                  
    iptables -A INPUT    -p tcp --tcp-flags ALL NONE        	 -j DROP 
    iptables -A INPUT    -p tcp --tcp-flags SYN,FIN SYN,FIN   -j DROP 
    iptables -A INPUT    -p tcp --tcp-flags FIN,RST FIN,RST   -j DROP
    iptables -A INPUT    -p tcp --tcp-flags ACK,FIN FIN   -j DROP 
    iptables -A INPUT    -p tcp --tcp-flags ACK,PSH PSH   -j DROP 
    iptables -A INPUT    -p tcp --tcp-flags ACK,URG URG   -j DROP 

 # Schutz vor IP Spoofing ( Senderadresse ist privat)				       		
     iptables -A INPUT  -s 0.0.0.0/8         -j DROP   
     iptables -A INPUT  -s 10.0.0.0/8        -j DROP   
     iptables -A INPUT  -s 172.16.0.0/12     -j DROP   
     iptables -A INPUT  -s 192.168.0.0/16    -j DROP                                   
     iptables -A INPUT  -s 224.0.0.0/4       -j DROP             
     iptables -A INPUT  -s 240.0.0.0/4       -j DROP 	 			
     iptables -A INPUT -d 255.255.255.255    -j DROP                                  

 # Drope alle XMAS packete
   iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

 # Drope alle NULL packete
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

 # Allgemeine Regeln fuer ICMP								
    iptables -A INPUT -p icmp -j DROP                      

 # Drope bad_incoming source ip adressen
    iptables -A INPUT -s 0.0.0.0/8       -j DROP
    iptables -A INPUT -s 10.0.0.0/8      -j DROP
    iptables -A INPUT -s 192.168.0.0/16  -j DROP
    iptables -A INPUT -s 224.0.0.0/3     -j DROP

 # Korrupte Datenpackete Zurückweisen
   iptables -A INPUT  -m state  --state INVALID -j DROP
   iptables -A OUTPUT -m state --state INVALID -j DROP

 #Regelwerk für Port 80 (WWW)
   iptables -A INPUT  -p TCP -s 0/0           --sport 1024:65535 -d xx.xx.xx --dport 80    -j ACCEPT
   iptables -A OUTPUT -p TCP -s xx.xx.xx --sport 80         -d 0/0   --dport 1024:65535    -j ACCEPT


 #Regelwerk für Port 9986 (SSH)
   iptables -A OUTPUT  -p tcp -s xx.xx.xx  --sport 513:65535 -d 0/0             --dport 22         -j ACCEPT
   iptables -A INPUT   -p tcp -s 0/0             --sport 9986      -d xx.xx.xx  --dport 513:65535  -j ACCEPT
 
 # Regelwerk für Port 7777 (Teamspeack2 UDP)
    iptables -A OUTPUT -p udp -s xx.xx.xx --dport 7777 -j ACCEPT 
    iptables -A INPUT -p udp  -s 0/0           --dport 7777 -j ACCEPT
 
 # Regelwerk für Port 14555 (Teamspeack2 WebInerface)
    iptables -A INPUT  -p TCP -s 0/0            --sport 1024:65535 -d xx.xx.xx --dport 14555   -m state --state NEW  -j ACCEPT
    iptables -A OUTPUT -p TCP -s xx.xx.xx --sport 14555         -d 0/0    --dport 1024:65535  -m state --state NEW  -j ACCEPT

 # Regelwerk für Port 51234 (Teamspeack2 TCP-Query Port)
    iptables -A OUTPUT -p udp -s xx.xx.xx --dport 51234 -j ACCEPT 
    iptables -A INPUT -p udp  -s 0/0           --dport 51234 -j ACCEPT

 # Rausgehende ICMP Packete
   iptables -A OUTPUT -p icmp -s xx.xx.xx -d 0/0    -j ACCEPT
   iptables -A INPUT -p icmp -s 0/0 -d xx.xx.xx     -j ACCEPT
   iptables -A OUTPUT -p icmp -s xx.xx.xx -d 0/0   -j ACCEPT
   iptables -A INPUT -p icmp -s 0/0 -d xx.xx.xx    -j ACCEPT

 # Rausgehendes traceroute
   iptables -A OUTPUT -p udp -s xx.xx.xx  --sport 1024:65535 -d 0/0 --dport 33434:33523  -j ACCEPT
   iptables -A OUTPUT -p udp -s xx.xx.xx --sport 1024:65535 -d 0/0 --dport 33434:33523  -j ACCEPT

 # bestehende Verbindungen akzeptieren
      iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
      iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
 # Ab hier alles dropen
      iptables -A INPUT -s 0/0 -j DROP
      iptables -A OUTPUT -d 0/0 -j DROP

   ;;
   stop)
      echo "Stoppe Firewall..."
      iptables  -F
      iptables -X
      iptables -P INPUT   ACCEPT
      iptables -P OUTPUT  ACCEPT
      iptables -P FORWARD ACCEPT
      ;;
   restart|reload|force-reload)
   $0 stop
   $0 start
      ;;
   *)
      echo "Usage: /etc/init.d/firewall (start|stop)"
      exit 1
      ;;
esac
#esac
exit 0
xx.xx.xx = ip des servers und der zweiten schnitstelle!

Ich hoffe ihr habt nun genug infos um die sachlage zu bewerten.
Desweiteren wolte ich wissen ob es ratsam ist einfach blind die oben geschriebenen regeln einfach nur zu dropen oder ob
mein probem damit gelöst were wenn ich die packete die ich filtern möchte etc rejecte sie also nur verwärfe da ein zurückweisen
eines packetes ja auch rechenzeit benöticht.

Der Server stand unter DDoS wodurch ich mich entschloss diesen packetfilter zu basteln wobei der ddos nun vorbei ist.
zumindest zeichnet sich nichs deratickes in protokollen oder der netstat ausgabe nieder. der DDoS kam von 1-2 RootServern
dich ich mitlerweile abused habe sowie die ips in die allbadip.txt gelegt habe die ganz am anfang von dem script eingelesen würd
und mittels iptables regel gedropt.

Das der Server icmp verbietet hat auch einen grund da ichs einfach besser befant wenn die user die ping zeiten nicht wissen
um scriptkiddys keinen eventuellen rückschluss zu geben sowie portscanning.

auf dem Server selber laufen folgende Dienste:

Code: Select all

- nginx als webcache 
- lighttpd auf localhost gebunden
- php5 als fastcgi
- teamspeack2 Server mit max. 30 Slot's
Ich entschuldige mich für meine schlechte rechtschreibung jedoch ist aufgrund meiner legastenie diese von meinerseite leider
nicht verbesserbar zumindest aber versuch ich so leserlich zu schreiben wie es mir möglich ist(Ja ich kenne das Firfox PlugIn!)

Ich hoffe ihr könt mir helfen den ich bin mitlerweile am verzeweifeln!

lg
Xterm
User avatar
rudelgurke
Posts: 408
Joined: 2008-03-12 05:36

Re: Probleme mit iptables Script

Post by rudelgurke »

Erstmal nur eine Vermutung - ändert sich etwas wenn das sysctl auf ip_conntrack_max weggelassen wird ?
xterm
Posts: 2
Joined: 2009-06-17 08:35

Re: Probleme mit iptables Script

Post by xterm »

nein leider nicht. ich habe desweiteren auch schon die syn-begrensung mal auskommentiert bringt auch nicht den gewünschten erfolg.
Ich weis langsam echt kein rat mehr was es sein könte!
User avatar
rudelgurke
Posts: 408
Joined: 2008-03-12 05:36

Re: Probleme mit iptables Script

Post by rudelgurke »

Wenn die benötigten Kernel Module alle geladen sind, evtl. eine ICMP Fragmentation explizit zulassen. Ping kann im Grunde auch zugelassen werden, mit httping stehen da alternative Mittel zur Verfügung - selbiges zu einem REJECT statt DROP - persönliche Meinung. Ob nun ein Portscanner keine Antwort erhält oder ein REJECT - Ergebnis ist das Gleiche.

Und ist:

Code: Select all

iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
und

Code: Select all

iptables -A INPUT -p TCP --sport 1024:65535 -d xx.xx.xx --dport 80 -j ACCEPT
iptables -A OUTPUT -p TCP -s xx.xx.xx --sport 80 --dport 1024:65535 -j ACCEPT
Sollte da nicht ein:

iptables -A INPUT -p TCP --sport 1024:65535 -d ..... --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

als lange Form. Die States sind ja schon vereinbart, nur nochmal ein "-A INPUT ... -m state --state NEW"