Blockiere China mit iptables

10

Ich habe mich gerade auf einem GitLab-Server angemeldet und festgestellt, dass seit meiner letzten Überprüfung des Servers 18.974 Anmeldungen fehlgeschlagen sind - fast 5 Tage. Ich habe die IPs überprüft und es scheint, dass fast alle von ihnen aus China stammten und versuchten, Zugang zu SSH und Brute Force zu erhalten. Ich fing an, einige IPs zu blockieren, aber dann wurde mir klar, dass es eine enorme Zeitverschwendung ist und eine bessere Idee wäre, das ganze Land zu blockieren.

Gibt es eine Möglichkeit, ALLES China oder ein anderes Land mit iptables zu blockieren?

Ich habe einige Artikel im Internet gefunden, aber fast alle sind Bash-Skripte. Ich bin ein Neuling unter Linux, daher verstehe ich all diese Skripte nicht wirklich. Ich finde iptables wirklich interessant und möchte mehr darüber erfahren.

Irgendwelche Ideen ? Vielen Dank!

Caranfil Alegzandru
quelle
4
Ich habe das gleiche Problem auf andere Weise gelöst. Ich habe SSH auf dem GitLab-Server meines Kunden durch Deaktivieren der Kennwort- und Challenge-basierten Authentifizierung gehärtet und die Anmeldung nur mit SSL-Schlüsseln zugelassen. Vielleicht würde das in Ihrer Situation funktionieren? Das Blockieren von IP-Bereichen kann das "Rauschen" verringern, bietet Ihnen jedoch keinen wirklichen Schutz vor brutalem Forcen.
Blendenzo
Bisher hat es nicht funktioniert. Der Gitlab-Server ist noch aktiv und ich hatte 0 Einbrüche. SSH-Zugriffe werden nur mit SSH-Schlüsseln durchgeführt und ich habe die Root-Anmeldung deaktiviert. Es ist nur so, dass ich
Iptables
1
Sie können Ihr SSH auch auf einen nicht standardmäßigen Port in Ihrem Router umstellen. Dadurch fielen meine SSH-Bot-Angriffsversuche von Hunderten pro Tag auf Null.
Bio-Marmor

Antworten:

7

Mithilfe von iptables können Bösewichte für ssh mithilfe des recentModuls automatisch identifiziert und anschließend blockiert werden. Das folgende Segment muss nach Ihrer generischen ESTABLISHED,RELATEDZeile stehen:

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Das jüngste Problem (in den letzten ein oder zwei Jahren) mit China ist, dass sie sehr klug geworden sind und sehr oft, sobald sie von einer IP-Adresse blockiert werden, einfach zu einer anderen im selben Subnetz wechseln und fortfahren. Dies birgt das Risiko, dass die standardmäßigen letzten Tabelleneinträge nicht mehr ausreichen (ich denke, der Standardwert ist 200). Ich überwache dies und schaue dann nach dem tatsächlichen IP-Segment und blockiere das gesamte Segment dauerhaft. In meinem Fall ist mir Kollateralschaden egal, dh jemanden zu blockieren, der unschuldig ist:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Wo oben:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Hier können Sie die gesamte Liste der IP-Adressen für China oder ein beliebiges Land in iptables oder einem anderen Format abrufen . Die Liste ist jedoch überraschend lang und ziemlich dynamisch. Ich selbst habe beschlossen, nicht die gesamte Liste zu blockieren.

Doug Smythies
quelle
Das ^! Könnte die beste Antwort sein, die ich je erhalten habe. Es mag eine dumme Frage sein, aber ich denke, all diese Regeln gehen in ein Bash-Skript ein, oder? Ich habe immer noch Probleme, Iptables zu verstehen, aber ich finde es faszinierend.
Caranfil Alegzandru
Ja, ich benutze ein Bash-Skript. Einige, und ich habe es auch verwendet, verwenden eine direkte Wiederherstellungsmethode für iptables, die schneller zu laden ist. Ich habe mich geändert, weil ich einige Nicht-Iptables-Befehle in dasselbe Skript eingefügt habe.
Doug Smythies
12

China-Block mit ipset

Sie können Ihren iptables nicht manuell einige tausend IP-Adressen hinzufügen, und selbst eine automatische Ausführung ist eine schlechte Idee, da dies zu einer hohen CPU-Auslastung führen kann (oder wie ich gelesen habe). Stattdessen können wir ipset verwenden, das für diese Art von Dingen entwickelt wurde. ipset verarbeitet große Listen von IP-Adressen. Sie erstellen einfach eine Liste und weisen iptables an, diese Liste in einer Regel zu verwenden.

Hinweis; Ich gehe davon aus, dass das Ganze als root ausgeführt wird. Passen Sie dies entsprechend an, wenn Ihr System auf sudo basiert.

apt-get install ipset

Als nächstes schrieb ich ein kleines Bash-Skript, um die ganze Arbeit zu erledigen, die Sie anhand der darin enthaltenen Kommentare verstehen sollten. Erstellen Sie eine Datei:

nano /etc/block-china.sh

Folgendes möchten Sie einfügen:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Speicher die Datei. Machen Sie es ausführbar:

chmod +x /etc/block-china.sh

Dies hat noch nichts getan, aber es wird in einer Minute, wenn wir das Skript ausführen. Zuerst müssen wir iptables eine Regel hinzufügen, die auf diese neue ipset-Liste verweist, die das obige Skript definiert:

nano /etc/iptables.firewall.rules

Fügen Sie die folgende Zeile hinzu:

-A INPUT -p tcp -m set --match-set china src -j DROP

Speicher die Datei. Um klar zu sein, sieht meine vollständige iptables.firewall.rules jetzt so aus:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

Im Moment hat sich am Server nichts geändert, da keine neuen Regeln angewendet wurden. Führen Sie dazu das Skript block-china.sh aus:

/etc/block-china.sh

Dies sollte eine Ausgabe anzeigen, da eine neue Liste chinesischer IP-Adressen abgerufen wird. Nach einigen Sekunden wird der Vorgang abgeschlossen und Sie kehren zu einer Eingabeaufforderung zurück.

Führen Sie Folgendes aus, um zu testen, ob es funktioniert hat:

iptables -L

Sie sollten jetzt eine neue Regel sehen, die China blockiert - die Ausgabe sollte so aussehen:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Fast fertig! Dies funktioniert und wird auch weiterhin für Neustarts verwendet. Die IP-Adressen ändern sich jedoch und diese Liste wird mit der Zeit veraltet. Wenn Sie eine aktualisierte Liste von IPs abrufen und anwenden möchten, können Sie das Skript block-china.sh einfach erneut ausführen.

Wir können die Maschine auch so einstellen, dass dies automatisch über einen Cron-Job erfolgt:

crontab -e

Fügen Sie eine Zeile wie die folgende hinzu:

* 5 * * * /etc/block-china.sh

Dies wird /etc/block-china.sh jeden Tag um 5 Uhr morgens ausführen. Der Benutzer, der das Skript ausführt, muss root sein oder über Root-Rechte verfügen.

Quelle

Surjit Sidhu
quelle
Warum nur auf das TCP-Protokoll beschränken? Es scheint ohne Angabe des Protokolls zu funktionieren. Schlagen Sie vor, die neueren aggregierten Listen zu verwenden, da diese viel kürzer sind:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies
Hier gibt es nichts, was das ipset nach dem Neustart wiederherstellt.
Doug Smythies
4

Möglicherweise möchten Sie etwas wie fail2ban installieren, damit es IPs blockiert, die versuchen, sich bei Ihrem Server anzumelden, und fehlschlagen.

Kyle H.
quelle
Ich könnte auch eine CSF-Firewall verwenden und jedes gewünschte Land aus den Konfigurationsdateien blockieren. Die Sache ist, dass ich wirklich iptables verwenden möchte, damit ich mehr darüber erfahren kann.
Caranfil Alegzandru
Sie müssten sehen, welchen Ländern welche IP-Adressblöcke zugewiesen sind, um herauszufinden, wer blockiert werden soll. Ich bin mir nicht sicher, ob es super genau wäre oder nicht. Sie können iptables -L verwenden, um aktuelle iptables-Regeln anzuzeigen, iptables-save, um anzuzeigen, welche Befehle zum Erstellen dieser Regeln ausgeführt wurden, dann Ihre eigenen Regeln entwerfen und mit Testmaschinen testen, um mehr darüber zu erfahren. So habe ich es gelernt.
Kyle H
0

Sie können das Geoip-Modul für iptables verwenden: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Sobald unser System aktualisiert und Abhängigkeiten installiert sind, installieren wir jetzt die xtables-Addons auf unserem Computer. Dazu laden wir den neuesten Tarball mit wget von der offiziellen xtables-addons-Projektseite herunter . Sobald es heruntergeladen ist, extrahieren wir den Tarball, kompilieren ihn und installieren ihn auf unserem Computer.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Als Nächstes führen wir ein Modul namens xt_geoip aus, das mit der Erweiterung xtables-addons geliefert wird, mit der die GeoIP-Datenbank von MaxMind heruntergeladen und in eine von erkannte Binärform konvertiert wird xt_geoip. Sobald es heruntergeladen ist, erstellen wir es und verschieben es auf den gewünschten xt_geoipPfad, d /usr/share/xt_geoip. H.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Hier ist die grundlegende Syntax für die Verwendung von iptables mit dem Geoip-Modul, um Datenverkehr zu blockieren, der aus einem Land stammt oder in ein Land bestimmt ist. Hier müssen wir anstelle des Landes einen aus zwei Buchstaben bestehenden ISO3166-Code verwenden, z. B. USA für USA, IE für Irland, IN für Indien, CN für China und so weiter.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Markus Lenger
quelle
0

Sie verwenden die IP2Location Firewall List , um iptables für China zu generieren.

Die Datei hat das folgende Format. Führen Sie es in der Shell aus und Sie sollten alle China-IP-Adressen blockieren.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Michael C.
quelle