AW: IPTables (Firewall) Script für euren Server
Also, ich habe dann doch nochmal 2 Nächte Zeit mit der Geschichte verbracht, da die Lösung mir bisher nicht ganz zufriedenstellend erschien.
Das Ergebnis ist (so glaube ich) der bessere Weg zum Ziel. Bei dem bisherigen Script war die DNS-Auflösung nicht mehr gegeben und auch die CHAINS waren nach wie vor ACCEPT!
File erstellen
Inhalt in das erstellte File kopieren
Hinweis 1: eth1 natürlich durch euer verwendetes Interface ersetzen.
Hinweis 2: Wer natürlich sein System oder Programme aktualisieren möchte sollte auch ausgehend Port 80 öffnen!
Hinweis 3: Auf Wunsch werde ich bekannte SSH Bot IP-Ranges gerne weiter aktulisieren. Wer auch das nicht haben mag, einfach löschen.
WICHTIG: Die Chains werden hier auf Drop geändert, also einmal ausgesperrt bleibt auch ausgesperrt! Darum vor dem ersten Start lieber einen Testlauf machen.
TESTLAUF: Zweite SSH-Verbindungs zum Server aufbauen, folgendes eingeben und mit der ersten SSH-Verbindung prüfen ob die Verbindung noch da ist.
Dieser Befehl schaltet die Firewall nach einem 60 Sekunden Testlauf wieder ab. Falls ihr ausgesperrt werdet, einfach eine Minute warten.
Woran erkennt man es ausgesperrt worden zu sein? Im ersten SSH Fenster kann man nichts mehr machen!
Symlink anlegen
Zum starten dann einfach "fw2 (start|stop|restart|reload|force reload)"
EDIT: Sorry da war noch ein Fehler bei den eingehenden ICMP drin
$iptables -I OUTPUT -o eth1 -p ICMP --icmp-type echo-request -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -I OUTPUT -o eth1 -p ICMP --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT
Sonst gibts keine Antwort auf Ping und das könnte Böse für KeepAlive enden
Also, ich habe dann doch nochmal 2 Nächte Zeit mit der Geschichte verbracht, da die Lösung mir bisher nicht ganz zufriedenstellend erschien.
Das Ergebnis ist (so glaube ich) der bessere Weg zum Ziel. Bei dem bisherigen Script war die DNS-Auflösung nicht mehr gegeben und auch die CHAINS waren nach wie vor ACCEPT!
File erstellen
Code:
nano /etc/init.d/firewallv2
Inhalt in das erstellte File kopieren
Hinweis 1: eth1 natürlich durch euer verwendetes Interface ersetzen.
Hinweis 2: Wer natürlich sein System oder Programme aktualisieren möchte sollte auch ausgehend Port 80 öffnen!
Hinweis 3: Auf Wunsch werde ich bekannte SSH Bot IP-Ranges gerne weiter aktulisieren. Wer auch das nicht haben mag, einfach löschen.
Code:
#!/bin/sh
# SUCHE NACH IPTABLES
iptables=`which iptables`
# ABBRECHEN WENN IPTABLES NICHT INSTALLIERT IST
test -f $iptables || exit 0
case "$1" in
start)
echo "FIREWALL WIRD GESTARTET..."
# ALLE BISHERIGEN REGELN LÖSCHEN
$iptables -t nat -F
$iptables -t filter -F
$iptables -X
# NEUE REGELN ERZEUGEN
$iptables -N garbage
$iptables -I garbage -p TCP -j LOG --log-prefix="DROP TCP-Packet: " --log-level 3
$iptables -I garbage -p UDP -j LOG --log-prefix="DROP UDP-Packet: " --log-level 3
$iptables -I garbage -p ICMP -j LOG --log-prefix="DROP ICMP-Packet: " --log-level 3
# ÄNDERE CHAIN POLICY AUF DROP (Alle Ein- und Ausgehenden Pakete verwerfen die keine Regel haben)
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP
# ERLAUBE ALLES ÜBER LOOPBACK
$iptables -I INPUT -i lo -j ACCEPT
$iptables -I OUTPUT -o lo -j ACCEPT
# ---> AUSGEHENDE VERBINDUNGEN (Alles mit # = keine Regel also gesperrt)
# ---> SSH PORT 22
#$iptables -I OUTPUT -o eth1 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# ---> DNS PORT 53
$iptables -I OUTPUT -o eth1 -p TCP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$iptables -I INPUT -i eth1 -p TCP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -I OUTPUT -o eth1 -p UDP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$iptables -I INPUT -i eth1 -p UDP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
[COLOR=#800000] # ---> WEB PORT 80
#$iptables -I OUTPUT -o eth1 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT[/COLOR]
# ---> WEB PORT 8080
#$iptables -I OUTPUT -o eth1 -p TCP --sport 1024:65535 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p TCP --sport 8080 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# ---> ICMP (INTERNET CONTROL MESSAGE PROTOCOL # = gesperrt)
$iptables -I OUTPUT -o eth1 -p ICMP --icmp-type echo-request -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$iptables -I INPUT -i eth1 -p ICMP --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT
# ---> NTP (NETWORK TIME PROTOCOL)
$iptables -I OUTPUT -o eth1 -p TCP --sport 1024:65535 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$iptables -I INPUT -i eth1 -p TCP --sport 123 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -I OUTPUT -o eth1 -p UDP --sport 1024:65535 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$iptables -I INPUT -i eth1 -p UDP --sport 123 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# ---> HIER EIN BEISPIEL FÜR CCCAM
#$iptables -I OUTPUT -o eth1 -p TCP --sport 1024:65535 --dport 12200 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p TCP --sport 12200 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# ---> HIER EIN BEISPIEL FÜR CAMD35
#$iptables -I OUTPUT -o eth1 -p UDP --sport 1024:65535 --dport 54321 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p UDP --sport 54321 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- EINGEHENDE VERBINDUNGEN (Alles mit # = keine Regel also gesperrt)
# <--- SSH PORT 22
#$iptables -I INPUT -i eth1 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p TCP --sport 22 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- DNS PORT 53
#$iptables -I INPUT -i eth1 -p TCP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p TCP --sport 53 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p UDP --sport 53 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p UDP --sport 53 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p UDP --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p UDP --sport 53 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# <--- WEB PORT 80
#$iptables -I INPUT -i eth1 -p TCP --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p TCP --sport 80 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- WEB PORT 8080
#$iptables -I INPUT -i eth1 -p TCP --sport 1024:65535 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p TCP --sport 8080 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- ICMP (INTERNET CONTROL MESSAGE PROTOCOL)
#$iptables -I INPUT -i eth1 -p ICMP --icmp-type echo-request -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p ICMP --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- NTP (NETWORK TIME PROTOCOL)
#$iptables -I INPUT -i eth1 -p TCP --sport 1024:65535 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p TCP --sport 123 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
#$iptables -I INPUT -i eth1 -p UDP --sport 1024:65535 --dport 123 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p UDP --sport 123 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- HIER EIN BEISPIEL FÜR CCCAM
#$iptables -I INPUT -i eth1 -p TCP --sport 1024:65535 --dport 12200 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p TCP --sport 12200 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# <--- HIER EIN BEISPIEL FÜR CAMD35
#$iptables -I INPUT -i eth1 -p UDP --sport 1024:65535 --dport 54321 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -I OUTPUT -o eth1 -p UDP --sport 54321 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# --- SICHERHEIT
# --- SYN FLOOD
$iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
# --- PORTSCAN
$iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# --- PING-OF-DEATH
$iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# --- HTTP LIMIT/MINUTE
#$iptables -A INPUT -i eth1 -p tcp --dport 80 -j LOG --log-prefix "Apache Access" --log-level 6 -m limit --limit 3/m
#$iptables -A INPUT -i eth1 -p tcp --dport 8080 -j LOG --log-prefix "NGINX Access" --log-level 6 -m limit --limit 3/m
# BESTEHENDE VERBINDUNGEN ZULASSEN (# = nicht zulassen)
#$iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#$iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# GARBAGE ÜBERGEBEN WENN NICHT ERLAUBT
$iptables -A INPUT -m state --state NEW,INVALID -j garbage
# VERBIETE ALLES WAS BISHER ERLAUBT WAR
$iptables -A INPUT -j garbage
$iptables -A OUTPUT -j garbage
$iptables -A FORWARD -j garbage
[COLOR=#ff0000] # LISTE BEKANNTER SSH BOTS SPERREN
# INFOS AT: INTERNET STORM CENTER / dshield.org
# CHINANET-BACKBONE No.31,Jin-rong Street,CN
$iptables -I INPUT -s 115.224.0.0/12 -j DROP
$iptables -I INPUT -s 116.8.0.0/14 -j DROP
$iptables -I INPUT -s 117.21.0.0/16 -j DROP
$iptables -I INPUT -s 122.224.0.0/12 -j DROP
$iptables -I INPUT -s 183.0.0.0/10 -j DROP
$iptables -I INPUT -s 220.176.0.0/15 -j DROP
# CHINANET-JS-AS-AP AS Number for CHINANET jiangsu province backbone,CN
$iptables -I INPUT -s 222.186.30.0/24 -j DROP
$iptables -I INPUT -s 222.186.34.0/23 -j DROP
$iptables -I INPUT -s 222.186.56.0/21 -j DROP
$iptables -I INPUT -s 222.186.130.0/23 -j DROP
# ATLANTIC-NET - Atlantic.net, Inc.,US
$iptables -I INPUT -s 69.28.92.0/22 -j DROP
# SERVER4YOU - Hosting Solutions International, Inc.,US
$iptables -I INPUT -s 209.239.112.0/20 -j DROP
# AS-COLOCROSSING - ColoCrossing,US
$iptables -I INPUT -s 23.94.0.0/22 -j DROP
# SERVERCENTRAL - Server Central Network,US
$iptables -I INPUT -s 216.246.0.0/17 -j DROP
$iptables -I INPUT -s 216.246.49.0/24 -j DROP
# TWTC - tw telecom holdings, inc.,US
$iptables -I INPUT -s 216.64.144.0/20 -j DROP[/COLOR]
;;
stop)
echo "FIREWALL WIRD GESTOPPT..."
[COLOR=#008000] [/COLOR] $iptables -t nat -F
$iptables -t filter -F
$iptables -X
$iptables -P INPUT ACCEPT
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD ACCEPT
;;
restart|reload|force-reload)
$0 stop
sleep 2
$0 start
;;
*)
echo "Usage: /etc/init.d/firewallv2 {start|stop|restart|reload|force-reload}"
exit 1
;;
esac
exit 0
Code:
chmod 775 /etc/init.d/firewallv2
WICHTIG: Die Chains werden hier auf Drop geändert, also einmal ausgesperrt bleibt auch ausgesperrt! Darum vor dem ersten Start lieber einen Testlauf machen.
TESTLAUF: Zweite SSH-Verbindungs zum Server aufbauen, folgendes eingeben und mit der ersten SSH-Verbindung prüfen ob die Verbindung noch da ist.
Dieser Befehl schaltet die Firewall nach einem 60 Sekunden Testlauf wieder ab. Falls ihr ausgesperrt werdet, einfach eine Minute warten.
Woran erkennt man es ausgesperrt worden zu sein? Im ersten SSH Fenster kann man nichts mehr machen!
Code:
/etc/init.d/firewallv2 start&&sleep 60&&/etc/init.d/firewallv2 stop
Symlink anlegen
Code:
ln -s /etc/init.d/firewallv2 /usr/sbin/fw2
Zum starten dann einfach "fw2 (start|stop|restart|reload|force reload)"
EDIT: Sorry da war noch ein Fehler bei den eingehenden ICMP drin
$iptables -I OUTPUT -o eth1 -p ICMP --icmp-type echo-request -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -I OUTPUT -o eth1 -p ICMP --icmp-type echo-reply -m state --state ESTABLISHED,RELATED -j ACCEPT
Sonst gibts keine Antwort auf Ping und das könnte Böse für KeepAlive enden
Zuletzt bearbeitet: