Hi Alle,
für meinen Debian Lenny Server (iptables 1.4.2-6, Kernel 2.6.32.11) überlege ich mir gerade neue iptable Regeln. Die Idee ist folgende:
Wenn eine Rechner aus dem Internet auch nur einmal eine neue Verbindung aufbaut, mit gesetztem SYN Flag, zu einem Port der nicht 80 oder 443 ist, dann setzte diesen Rechner auf eine Blacklist für eine Stunde. Pakete von Rechnern in der Blacklist werden sofort fallen gelassen.
Hat da Jemand von Euch einen Ansatz wie man das machen kann?
Grüße Markus
iptables, Rechner in Blacklist für 1 Stunde blocken
- feldmaus
- Beiträge: 1308
- Registriert: 14.06.2005 23:13:22
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: Deutschland
Re: iptables, Rechner in Blacklist für 1 Stunde blocken
So habe im Netz endlich was interessantes gefunden http://www.linux-magazin.de/Heft-Abo/Au ... Hausverbot und weiß nun endlich wofür man das recent Modul von iptables braucht.
Die erste Regel blockt IP-Adressen die schon in der Blacklist enthalten sind und aktualisiert den Zeitstempel, wann diese IP-Adresse das letzte mal gesehen wurde. IP-Adressen die in der Blacklist stehen wird der komplette Zugang zu allen Ports für 3600 Sekunden (1Stunde) verwehrt.
Die zweite Regel blockt alles tcp Pakete, die einen Verbindungsaufbau unternehmen wollen und nicht als Ziel-Port 80 (http) oder 443 (https) haben. Falls diese Pakete noch nicht in der Blackliste stehen, werden diese in die Blacklist eingetragen.
Laut dem Beitrag vom linux-magazin.de hat das recent modul auch Nachteile. ein Angreifer könnte eine gespoofte Adresse Nutzen um, somit vertrauenswürdige Rechner zu blocken.
Stellen die anderen Protokolle udp, icmp auch Probleme dar? Ja. Ich schaue mir nochmal Snort an.
Hier noch ein paar Links zu recent:
http://snowman.net/projects/ipt_recent/
http://linux.die.net/man/8/iptables
Grüße Markus
Code: Alles auswählen
iptables -A INPUT -i $DSLIF -m recent --name blacklist --update --seconds 3600 -j DROP
iptables -A INPUT -i $DSLIF -p tcp -m mport --dport 1:79,81:442,444:65535 -m recent --name blacklist --set --syn -j DROP
Die zweite Regel blockt alles tcp Pakete, die einen Verbindungsaufbau unternehmen wollen und nicht als Ziel-Port 80 (http) oder 443 (https) haben. Falls diese Pakete noch nicht in der Blackliste stehen, werden diese in die Blacklist eingetragen.
Laut dem Beitrag vom linux-magazin.de hat das recent modul auch Nachteile. ein Angreifer könnte eine gespoofte Adresse Nutzen um, somit vertrauenswürdige Rechner zu blocken.
Stellen die anderen Protokolle udp, icmp auch Probleme dar? Ja. Ich schaue mir nochmal Snort an.
Hier noch ein paar Links zu recent:
http://snowman.net/projects/ipt_recent/
http://linux.die.net/man/8/iptables
Grüße Markus
Zuletzt geändert von feldmaus am 07.05.2010 23:49:43, insgesamt 1-mal geändert.
Re: iptables, Rechner in Blacklist für 1 Stunde blocken
Wir hatten so ein ähnliches Thema mal hier diskutiert.
Oh, yeah!
- feldmaus
- Beiträge: 1308
- Registriert: 14.06.2005 23:13:22
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: Deutschland
Re: iptables, Rechner in Blacklist für 1 Stunde blocken
Danke Duff,Duff hat geschrieben:Wir hatten so ein ähnliches Thema mal hier diskutiert.
habe Heute gemerkt dass ich auf meine Homepage nicht mehr drauf komme, entweder weil Jemand zu häufig auf meinen 443 Port gegangen ist, oder ich einen Fehler gemacht habe. Ich werde das mit hashlimit mal ausprobieren, obwohl ich es noch nicht ganz verstehe.
Hashlimit kann also für jede Source-IP einen seperaten Bucket erstellen? Zur Zeit nutze ich limit, wo alle Source-IP's nur ein Bucket haben pro Port. Und das ist bei hashlimit anders?
mistersixt hatte das Modul -m tcp in seinem Beispiel viewtopic.php?f=30&t=113342&hilit=iptables#p718460 geladen. Warum? Für die Angabe des Protokolls muss man doch keine Erweiterung laden?
Ich nehme mal an, dass noch eine DROP Regel folgen muss, wie in diesem Beispiel http://dentaku.wazong.de/tag/linux/. Vielleicht ist es für mich schon ein bisschen spät, aber ich sehe gerade nicht den Vorteil gegenüber dem recent Modul?
Grüße Markus
- feldmaus
- Beiträge: 1308
- Registriert: 14.06.2005 23:13:22
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: Deutschland
Re: iptables, Rechner in Blacklist für 1 Stunde blocken
Also ich poste einen Ausschnitt meiner aktuellen Firewall:
Beides sind eigene Chains, die noch nicht ganz harmonisieren, bzw. redundant sind. In der states Chain werden Alle Regeln bearbeitet, also tcp,udp icmp u.s.w. und in der attacks Chain halt nur tcp. Vielleicht sollte ich das doch lieber so lassen? Wie leicht ist es möglich die Regeln mit der Status-Abfrage Established,Related zu überlisten?
Grüße Markus
Code: Alles auswählen
echo -e "\nBruteforce,Port-Scans,DoS,SYN-Flood attacks"
iptables -N attacks
iptables -A INPUT -i "$DSLIF" -p tcp -j attacks
iptables -A FORWARD -i "$DSLIF" -p tcp -j attacks
iptables -A attacks -m state --state ESTABLISHED,RELATED -j RETURN
iptables -A attacks -m recent --update --seconds 600 -j DROP
iptables -A attacks -p tcp -m state --state NEW -m multiport --dport 1:79,81:442,444:65535 -m recent --set -j DROP
iptables -A attacks -p tcp -m state --state NEW -m hashlimit --hashlimit-name http --hashlimit-upto 6/hour --hashlimit-burst 6 --hashlimit-mode srcip --dport 80 -j RETURN
iptables -A attacks -p tcp -m state --state NEW -m hashlimit --hashlimit-name https --hashlimit-upto 6/hour --hashlimit-burst 6 --hashlimit-mode srcip --dport 443 -j RETURN
iptables -A attacks -m limit --limit 3/s --limit-burst 3 -j LOG --log-level info --log-prefix "Attacks-Rule: "
iptables -A attacks -j DROP
echo -e "\nUnaufgeforderte und ungueltige Verbindungsaufbauten"
iptables -N states # Ungueltige und unaufgeforderte Pakete
iptables -A INPUT -i "$DSLIF" -j states
iptables -A FORWARD -i "$DSLIF" -j states
iptables -A states -p icmp --icmp-type 8 -j RETURN # Sollen weiter verarbeitet werden, daher RETURN
iptables -A states -m state --state NEW,INVALID -m limit --limit 3/s --limit-burst 3 -j LOG --log-level info --log-prefix "State-Rule: "
iptables -A states -m state --state NEW,INVALID -j DROP
iptables -A states -j RETURN # Ruecksprung, falls noch nicht verworfen
Grüße Markus
- feldmaus
- Beiträge: 1308
- Registriert: 14.06.2005 23:13:22
- Lizenz eigener Beiträge: GNU General Public License
- Wohnort: Deutschland
Re: iptables, Rechner in Blacklist für 1 Stunde blocken
Ich wollte hier nochmal meine Änderung posten, die auch sehr gut funktioniert:
Ich habe jetzt 2 eigene Chains erstellt, die im Prinzip alle feindliche Angriffe abwehren sollen. Die Chain attacksinput ist für Pakete die vom internet in meinen Server wollen und die Chain attacksforward ist für Pakete die aus dem Internet durch meinen Server in mein lokales Netz wollen. Es werden nur bekannte Sachen durchgelassen, oder Sachen die schon eine aufgebaute Verbindung vorweisen können. Eine Blacklist habe ich auch hinzugefügt. Alle Pakete die nicht zu Port 80 oder 443 wollen kommen sofort in die Liste und werden für 10min. fallen gelassen. Meine Regeln decken alle Protokolle ab.
Ich nutze hier vorwiegend RETURN. Die Pakete gehen so wieder zurück zur Haupt Chain und werden dort weiter verarbeitet.
Grüße Markus
Code: Alles auswählen
echo -e "\nBruteforce,Port-Scans,DoS,SYN-Flood attacks"
iptables -N attacksinput
iptables -A INPUT -i "$DSLIF" -j attacksinput
iptables -A attacksinput -m state --state ESTABLISHED,RELATED -j RETURN
iptables -A attacksinput -m recent --update --seconds 600 -j DROP
iptables -A attacksinput -p tcp -m state --state NEW -m multiport --dport 1:79,81:442,444:65535 -m recent --set
iptables -A attacksinput -p tcp -m state --state NEW -m hashlimit --hashlimit-name http --hashlimit-upto 6/hour --hashlimit-burst 6 --hashlimit-mode srcip --dport 80 -j RETURN
iptables -A attacksinput -p tcp -m state --state NEW -m hashlimit --hashlimit-name https --hashlimit-upto 6/hour --hashlimit-burst 6 --hashlimit-mode srcip --dport 443 -j RETURN
iptables -A attacksinput -p icmp --icmp-type 8 -j RETURN # Sollen weiter verarbeitet werden, daher RETURN
iptables -A attacksinput -m state --state NEW,INVALID -m limit --limit 3/s --limit-burst 3 -j LOG --log-level info --log-prefix "attacksinput(NEW,INVALID): "
iptables -A attacksinput -m state --state NEW,INVALID -m recent --set -j DROP
iptables -A attacksinput -m limit --limit 3/s --limit-burst 3 -j LOG --log-level info --log-prefix "attacksinput: "
iptables -A attacksinput -m recent --set -j DROP
iptables -N attacksforward
iptables -A FORWARD -i "$DSLIF" -j attacksforward
iptables -A attacksforward -m state --state ESTABLISHED,RELATED -j RETURN
iptables -A attacksforward -m recent --update --seconds 600 -j DROP
iptables -A attacksforward -m state --state NEW,INVALID -m limit --limit 3/s --limit-burst 3 -j LOG --log-level info --log-prefix "attacksforward(NEW,INVALID): "
iptables -A attacksforward -m state --state NEW,INVALID -m recent --set -j DROP
iptables -A attacksforward -m limit --limit 3/s --limit-burst 3 -j LOG --log-level info --log-prefix "attacksforward: "
iptables -A attacksforward -m recent --set -j DROP
Ich nutze hier vorwiegend RETURN. Die Pakete gehen so wieder zurück zur Haupt Chain und werden dort weiter verarbeitet.
Grüße Markus