BEARBEITEN:
Es ist erstaunlich, wie der Drang, eine Lösung zu finden, manchmal ausreicht, um einen langsam, aber stetig einer Lösung näher zu bringen. Und je öfter ich meine Frage erneut lese, um sie zu klären, desto mehr wird mir klar, dass diese „Frage“ den Rahmen einer „einfachen“ Frage oder die Idee, Dinge von dieser Community beantwortet zu bekommen, eher überschreitet.
Ich werde die Struktur dieser Frage in den nächsten Stunden neu formulieren, da ich die Betriebskonzepte von iptables immer besser verstanden habe. Der Prozess des Verstehens hat auch einige viel spezifischere Fragen hervorgebracht, die ich dieser Community bald zur Verfügung stellen und mit dieser Frage verknüpfen werde.
Kurzgesagt: Mein Problem besteht darin, die richtigen Regeln zu finden, um Folgendes zu erreichen:
- meine eigenen Regeln
- Fehler2Ban
- zusätzliche DNS-Blacklists arbeiten zusammen, wobei "meine Regeln" auch bedeutet, dass mein Land für SSH auf die Whitelist gesetzt wird und damit alle anderen Länder für SSH blockiert werden,ABERerlaubendalleLänder/Bereiche/IPs für DNS-Abfragen, mit Ausnahme einer Reihe von Ländern/Bereichen/IPs auf der schwarzen Liste.
In Zahlen:
- für SSH: 50 Bereiche auf die Whitelist setzenODERBlacklist mit ca. 620.000 Bereichen (erstellt über ipdeny.com etc.)
- Blacklist-Einträge für DNS: ca. 140 (Satz von U32-Regeln,Skript(e))
- 25+/- Regeln für die Zusatzleistungen (siehe unten)
Textversion: Ich kämpfe mit der Implementierung einer Lösung für meine Anforderungen: Szenario wie folgt. Ich habe einen (vorerst gehe ich von DNS aus) Server. Neben Bind müssen SSH, Sendmail, https und Munin berücksichtigt werden:
Dies war im Allgemeinen leicht zu erreichen. Zusätzlich wurde Fail2ban installiert, da ich mit einigen (D)Dos-Angriffen aus aller Welt konfrontiert war. Mein Hauptziel war, den Server so weit wie möglich abzuriegeln.
Meine Idee war, nur einige IP-Bereiche meines Landes auf die Whitelist zu setzen, die mit möglichen dynamischen DNS-Zuweisungen von ISPs übereinstimmen, auf die ich Zugriff habe – also DSL und Mobilfunk. Auf diese Weise sperre ich mich nicht selbst aus.
Ich habe alle Netzbereiche meiner ISPs nachgeschlagen, was zu folgendem Skript/Regelsatz führte:
#ports:
# 22: SSH (#4,#5) (ssh)
# 25: SMTP (#20) (outgoing, sendmail for f2b report)
# 53: DNS (!!#16!! see end of #16 as differs for ns1&2) (outgoing, bind)
# 443: HTTPS (#10) (outgoing, dns-blacklist update)
#4949: munin (#26) (outgoing, sending client stats to server)
# Modify this file accordingly for your specific requirement.
# http://www.thegeekstuff.com: http://www.thegeekstuff.com/scripts/iptables-rules
# 1. Delete all existing rules
#iptables -F
# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 4. Allow ALL incoming SSH
#iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 5. Allow incoming SSH only from a sepcific network (kabelBW/Unitymedia, Telekom, Accelerated)
# note: Using '-I' instead of '-A' to insert to top of INPUT chain to put rule in front of fail2ban!
iptables -A INPUT -i eth0 -p tcp -s 5.10.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.10.160.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.176.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.146.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.158.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 24.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 31.16.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.4.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.24.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.49.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.114.96.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.201.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.209.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.5.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.223.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.237.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.252.128.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 62.143.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 77.20.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.42.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.94.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 80.69.96.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 81.210.128.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.211.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.212.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 83.169.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.200.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.201.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 85.216.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.152.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.64.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.89.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 92.50.64.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 94.79.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.88.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.208.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.222.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.90.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.192.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 130.180.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 134.3.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 146.52.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 149.172.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 176.198.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.24.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.200.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 188.192.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 217.8.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
service fail2ban restart
# 10. Allow outgoing HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 13. Ping from outside to inside
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -A INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -A INPUT -p tcp --dport 4949 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 4949 -j ACCEPT
service munin-node restart
sh /root/update_domain_blacklist.sh
Durch den Neustart von fail2ban vor Regelsatz Nr. 10 soll sichergestellt werden, dass die Ketten nach dem Löschen aus iptable (geleert durch -F am Anfang des Skripts) korrekt (neu) eingerichtet werden. Dasselbe gilt für Munin, das sich darüber beschwerte, dass es seinen Server nicht erreichen konnte, wenn es nach Anwendung der Ausnahmeregeln nicht neu gestartet wurde.
Ich beabsichtige, die Regeln über /etc/rc.local anzuwenden. Das impliziert, dass bereits Ketten für fail2ban und munin erstellt werden.
Der Firewall-Überprüfungsablauf, den ich erreichen möchte, ist folgender: Anforderung ist DNS? -> (a); ssh? -> (b); einer meiner anderen Dienste? -> (c); sonst noch etwas? -> (d):
- (a): Ausführen eines DNS-Blacklist-Skripts, falls nicht auf der schwarzen Liste
- (b): dienen, wenn nicht auf der schwarzen Liste ODER wenn gemäß meiner eingestellten Netzreichweite auf der weißen Liste
- (c): Aufschlag, gemäß meinen festgelegten Regeln
- (d): DROP/TARPIT/was auch immer die beste Vorgehensweise ist
- wenn (b), zusätzlich fail2ban übergeben
Problememit den obigen Regeln:
- fail2ban greift vor Whitelist-Prüfung -Gutfür meinen SSH-Teil,schlechtfür meinen DNS-Teil: meine Vermutung
Ich habe dann versucht, mit ipset „die ganze Welt“ außer meinen 50 Bereichen zu blockieren/auf die schwarze Liste zu setzen. Theoretisch möglich, aber das Parsen der 620.000 Bereiche dauert mehr als 10 Minuten; ich habe den Vorgang abgebrochen und bin zu meinen Whitelist-Bereichen zurückgekehrt. Nächste Idee: weiterhin ipset für die 50 Bereiche verwenden und dieUmkehrungdieser Liste für SSH:
!/bin/bash
#Script to process ip ranges to ban using IPSet and IPTables
# 10. Allow outgoing HTTPS
iptables -I OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -I OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -I INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -I INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix #to mail.awib.it (82.211.19.134)
iptables -I OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -I INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -I INPUT -p tcp --dport 4949 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 4949 -j ACCEPT
#iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
ipset create countryblock hash:net
while read line; do ipset add countryblock $line; done < blocklist.txt
iptables -A INPUT -m set ! --match-set countryblock src -j DROP
während „blocklist.txt“ meine 50 Bereiche enthält, die auf die Whitelist gesetzt werden sollen, oder umgekehrt, die auf die Blacklist gesetzt werden sollen. Aber umgekehrt bedeutet das auch, dass der GESAMTE DNS-Verkehr blockiert wird usw. … das macht mich wahnsinnig! :-D
Aber aus irgendeinem Grund hatte ich entweder überhaupt keinen Zugriff auf meinen Server oder der umgekehrte Weg funktionierte nicht (ich habe einige Web2SSH-Applets ausprobiert, nur um nach einer SSH-Eingabeaufforderung zu suchen).
Ich habe in den Konfigurationen auch entsprechende Fail2ban-Createaction-Regeldefinitionen gefunden. Um den Mehraufwand zu reduzieren, würde ich die Standardregeln von Munin und F2B jedoch gerne so belassen, wie sie sind, und die notwendigen Änderungen an meinen eigenen Regeln und vielleicht am DNS-Blacklist-Skript vornehmen.
Ich weiß, dass diese Frage/Anfrage nicht die einfachste ist, und Sie fragen sich vielleicht, warum Sie nicht einfach fail2ban verwenden? Ich möchte wissen, ob es verdächtige Aktionen gibt, und daher ist es nett, einen Bericht über blockierte Hosts zu erhalten. Allerdings möchte ich dies nicht für alle ausländischen Hosts haben (zehnfach, da ich fail2ban auf über 10 Servern verwende).
Ein anderer Ansatz wäre vielleicht ein dedizierter Firewall-Server/Router, der den gesamten Datenverkehr abwickelt. Dies wäre jedoch eine ziemlich komplexe Regelkonfiguration und ich möchte nicht versehentlich ALLE meine Server aufgrund einer dummen Fehlkonfiguration/fehlerhaften Regel oder was auch immer sperren. Außerdem würde dies meinen kostenlosen Datenverkehr überschreiten, der derzeit auf alle 10 Server aufgeteilt wird.
Ich hoffe, dass ein Freund mit technischem Hintergrundwissen da ist, der mir helfen kann, die Regeln richtig zu sortieren.
Bevor ich diese Frage unnötig in die Länge ziehe, warte ich jetzt und stelle die gewünschten Informationen bereit.
PS:vielleicht kann jemand das „ipset“-Tag hinzufügen, da ich es aufgrund mangelnder Reputation nicht erstellen kann. Danke!
Antwort1
Sieht furchtbar kompliziert aus....
sshd
Ich denke, dass Sie durch den Wechsel zu anderen Ports einen erheblichen Mehrwert hinsichtlich Sicherheit und Leistung erzielen können munin
.
Wenn Sie diese Dienste auf Ports ausführen, die nicht dem Standard entsprechen, wird der Großteil des Brute-Force-/DOS-Verkehrs unterdrückt. Fail2ban sollte danach in der Lage sein, alle Ausreißer zu erkennen.
Durch die Verlagerung zu custom
Ports erstellen Sie im Wesentlichen Folgendes:
iptables -A "Anyone that doesn't know the correct ssh port" -j DROP
Sie können zwar weiterhin Verbindungsversuche mit dem Port protokollieren 22
, ich denke jedoch, dass Sie den Speicherplatz besser nutzen können.
Antwort2
ipset create banned_hosts hash:net family inet hashsize 524288 maxelem 800000 counters comment
ipset create whitelist hash:net family inet hashsize 524288 maxelem 800000 counters comment
iptables -I INPUT 1 -m set --match-set banned_nets src -j DROP
iptables -I INPUT 2 -m set --match-set whitelist src -j ACCEPT
ipset add banned_hosts 171.248.31.131
ipset add banned_hosts 191.185.207.16
ipset add banned_hosts 45.247.22.251
ipset add banned_hosts 82.98.162.90
ipset add banned_hosts 125.227.181.216
ipset add banned_hosts 122.117.163.44
alles speichern ipset
ipset save >all.txt
alles laden
ipset load <all.txt