Frage iptables Tipps & Tricks


Ich bin mir sicher, dass Linux-Systemadministratoren damit vertraut sind iptables, die Benutzerlandschnittstelle zum netfilter Paketfilter-Framework.

Nun, diese "Frage" soll eine sein Community Wiki zum Sammeln verschiedener Bits-N-Stücke von iptables Weisheit. Nichts ist zu gewöhnlich oder zu dunkel. Veröffentlichen Sie alles, was Sie wissen, um anderen das Beste zu bieten iptables.


57
2018-03-10 14:15


Ursprung




Antworten:


Whitelist und Blacklist mit iptables verwenden

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

Skript zum Öffnen von Ports

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

Portscan blockieren

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

Gefälschte / ungültige Pakete

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

Block Smurf Angriffe

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

Block ICMP (auch bekannt als Ping)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

25



Ziehen Sie in Betracht, den "gefälschten" Kommentaren einen Kommentar hinzuzufügen, damit weniger erfahrene Benutzer wissen, warum die Quelladressen als gefälscht betrachtet werden (... wenn sie auf einer WAN-Oberfläche ankommen). - 3molo
Guter Anruf :-). Erledigt. - Bart De Vos
warten. Ist nicht Block ICMP (aka Ping) Zeile redundant zu Block Smurf Angriff Linie: iptables -A INPUT -p icmp -m icmp -j DROP? - Stann
auch - hier ist die Erklärung für viele der hier beschriebenen Artikel: newartisans.com/2007/09/neat-tricks-mit-iptables.html - Stann
Rufen Sie das Whitelist-Skript auf: Theres iptables in Zeile 8 und dann $IPTABLES später. Ist es genug, nur zu benutzen iptables überall? Sonst nehme ich an, Sie müssten etwas zuweisen IPTABLES=/sbin/iptables Recht? - UpTheCreek


Optimieren Sie die Netfilter Performance mit ipset

Wenn Sie eine schreiben Menge von ähnlichen Regeln, die nur auf IP, Port oder beidem basieren, sollten Sie sie verwenden ipset um die Leistung von Netfilter zu optimieren.

Zum Beispiel:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

Dies bedeutet, dass ein Paket mit der Quelladresse 192.168.251.177 zuerst durchlaufen muss Hunderte von Regeln, bevor es sein ACCEPT-Urteil erhalten kann.

Natürlich teilen erfahrene Systemadministratoren die Regeln nach Subnetz auf. Aber das immer noch bedeutet Hunderte von Regeln.

ipset zur Rettung!

Definieren Sie zunächst einen IP-Satz von ipmap Art:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Dann befüllen Sie es mit den Adressen:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

Schließlich, ersetzen Sie die Hunderte von Iptables-Regeln oben mit ein Regel:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

Wenn ein Paket ankommt, führt netfilter ein sehr schnell Bitmap-Suche nach der Source-IP des Pakets (src) gegen die Allowed_Hosts IP-Set. Alle Pakete, die von 192.168.0.0/16 kommen, werden auftreten ein Regel. Und glauben Sie mir, dass das Suchen einer Bitmap mindestens zwei Größenordnungen schneller ist als das Ausführen von Hunderten von iptables-Regelprüfungen.

ipset ist nicht auf IP-Adressen beschränkt. Es kann auch basierend auf Ports, IP-Port-Tupel, Netzwerk- / Subnetzadressen, IP-MAC-Tupel usw. übereinstimmen. Und es kann diese Kriterien als Quelle oder Ziel oder eine Mischung aus beiden (im Falle von Tupeln).

Und schließlich mit ipset Sie können IP-Adressen automatisch in Blacklists / Whitelists setzen. Diese Blacklists / Whitelists können auch "altern" und die IP-Adresse nach Ablauf einer konfigurierbaren Zeit automatisch löschen.

Bitte beziehen Sie sich auf ipsetMan-Seite für mehr Details.

Sehr wichtiger Hinweis:

Manche Linux-Distributionen können dies tun nicht haben "out-of-the-box" Unterstützung für ipset (z. B. Ubuntu 10.04 hatte dieses Problem). Auf diesen Systemen ist eine Methode zu installieren ipset aus dem Quellcode.

Stattdessen herunterladen ipset's Quelle von seiner Website: http://ipset.netfilter.org/install.html

Alternativ, wenn Sie verwenden xtables-addons, ipset ist in seiner Quelle enthalten: http://xtables-addons.sourceforge.net/


23



Das ist wirklich schade, dass es unter Debian und Ubuntu standardmäßig nicht unterstützt wird. Ich dachte, du würdest einige Obsure-Distributionen auflisten: - UpTheCreek
@UpTheCreek Ich habe meine Antwort bearbeitet ... die "besondere Notiz" war während der Zeit der Veröffentlichung der Antwort anwendbar, aber jetzt nicht mehr anwendbar. - pepoluan


Fügen Sie Ihren Regeln Kommentare hinzu:

-m comment --comment "Comments help to read output of iptables -nvL"

21





Bekämpfen Sie bekannte TCP-Angriffe

Fügen Sie die folgenden Regeln hinzu, vorzugsweise in -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

Die blockierten Angriffe sind:

  • SYN-FIN Angriff
  • SYN-RST-Angriff
  • X-Mas Angriff
  • nmap FIN-Scan
  • NULLflags Angriff
  • ALLflags angreifen

(Fühlen Sie sich frei, die Namen der Angriffe oben zu bearbeiten)


16



Das -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP könnte entfernt werden, als die -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP wird jedes Paket fangen, das es blockieren könnte. - Ael Ombreglace
Gemäß Sicherheit.stackexchange.com/questions/4603/.... "Es gibt keine Notwendigkeit, ungültige oder missgebildete Pakete fallen zu lassen, alle diese Angriffe sind ein Jahrzehnt alt. Die Linux-Kernel-Entwickler sind viel aktueller als Sie, welche Pakete gültig sind und welche nicht." Was ist mit zukünftigen Fehlern? " , könnten sich einige streiten. Nun, woher weißt du, dass der zukünftige Fehler im TCP-Handler und nicht im iptables-TCP-Parser liegt? " - Matt
Ist das noch anwendbar? - Vlastimil
@VlastimilBurian theoretisch Sie werden nicht mehr benötigt. Aber das Hinzufügen dieser Regelwerke verlangsamt weder das Netzwerk noch erhöht es die CPU-Last, daher sehe ich keine Gründe, sie nicht hinzuzufügen und zu vergessen - pepoluan


NAT aktivieren

  1. echo 1 > /proc/sys/net/ipv4/ip_forward 
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Schritt 1 legt den Kernel-Parameter fest, um IP-Weiterleitung zu ermöglichen, Schritt 2 richtet eine iptables-Regel ein, die NAT auf der Schnittstelle eth0 aktiviert.


7



Das wird nicht durch einen Neustart persistent sein, oder? Sie müssen bearbeiten /etc/sysctl.conf  net.ipv4.ip_forward = 1. (Angenommen Red Hat oder Derivat.) - Aaron Copley


Blockiere ICMP-Angriffe

Fügen Sie die folgenden Regeln hinzu, vorzugsweise in -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

Die erste Regel blockiert alle ICMP-Pakete, deren "Fragmentierungsflag" nicht 0 ist. (ICMP sollte noch nie fragmentiert sein; sie sollten kleine Nutzlasten tragen)

Die zweite Regel blockiert übergroße nicht fragmentierte ICMP-Pakete.


6



Würde MTU Discovery nicht den Weg brechen? - Matt
@Matt nein, da die Pfad-MTU-Erkennung Pakete verwendet, die nur so groß sind wie die Ethernet-Nutzlastgröße, d. H. 1500 Bytes, von denen 8 Bytes vom IP-Header und ICMP-Header verwendet werden. - pepoluan
Danke für die Klärung, aber 1492-64k? Warum ist das nicht 1500-65k? Ich kann 1492 für PPPoE aber gerade Ethernet verstehen. - Matt
Ist das noch anwendbar? - Vlastimil
@ VlastimilBurian Ich würde ja sagen. Es gibt immer noch keine Notwendigkeit für übergroße ICMP-Pakete. - pepoluan


verwenden FeuerHOL - praktische iptables-Hülle

Ich fand es viel intuitiver als direkte Iptables-Befehle. Speziell für Personen, die Erfahrung mit anderen Firewalls haben:

FireHOL ist eine iptables Firewall   Generator produziert Stateful Iptables   Paketfilter-Firewalls unter Linux   Hosts und Router mit einer beliebigen Anzahl von   Netzwerkschnittstellen, beliebig viele   Routen, beliebig viele Dienste,   eine beliebige Anzahl von Komplexität zwischen   Variationen der Dienstleistungen (einschließlich   positive und negative Ausdrücke).


4



Ich bevorzuge Shorewall, das aktiv entwickelt wurde, IPv4 und IPv6 unterstützt und Firewalls für andere iptables-Systeme erstellen kann. - BillThor
@BillThor klingt wie ein gutes Werkzeug - danke - Ophir Yoktan


(aus meiner iptables_tricks.txt-Datei, die von vielen Orten neu kompiliert wurde: P)

Lässt Iptables 15 Sekunden zwischen neuen Verbindungen von derselben IP an Port 22 (SSH) warten:

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

4



Gleich, aber mit dem Zählen der Versuche: -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH  -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP - alexm


IPTABLES Video Tutorials

Episode 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedded

Episode 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related

Letzte Episode

http://www.youtube.com/watch?v=JojqHKcSxpo&feature=player_embedded

Wird ein guter Anfang für jeden Neuling sein.


3



sehr gutes Tutorial - Stann


IP-Sets wurden überarbeitet

Es gibt bereits eine Antwort, die IP-Sets erwähnt. Es ist jedoch eher eindimensional, da es sich auf die Leistungsgewinne gegenüber klassischen Regeln konzentriert, und die Tatsache, dass IP-Sets das Problem mit vielen individuellen IP-Adressen mildern, die nicht einfach als Subnetz in CIDR-Notation ausgedrückt werden können.

Die unten verwendete Notation

Zum ipset Ich werde die Schreibweise von lesen verwenden ipset restore und geschrieben von ipset save.

Entsprechend für iptables (und ip6tables) Regeln werde ich die Schreibweise als gelesen verwenden iptables-restore und geschrieben von iptables-save. Dies führt zu einer kürzeren Notation und erlaubt es mir, potenzielle IPv4-only (Präfix) hervorzuheben -4) oder nur IPv6 (mit Präfix) -6) Regeln.

In einigen Beispielen leiten wir den Paketfluss in eine andere Kette um. Es wird angenommen, dass die Kette an diesem Punkt existiert, so dass die Linien zum Erzeugen der Ketten nicht erzeugt werden (noch wird der Tabellenname oder die Befehle erwähnt) COMMITam Ende).

Erweiterte IP-Adressen

IP-Sets können viel mehr, als es in erwähnt wurde die andere Antwort und Sie sollten unbedingt die IP-Set-Dokumentation lesen (ipset(8)) zusammen mit iptables-extensions(8) zusätzlich zu diesem kurzen Eintrag hier.

Zum Beispiel konzentriere ich mich hauptsächlich auf drei Settypen: hash:ip, hash:net und list:set, aber es gibt mehr als diese und alle haben gültige Anwendungsfälle.

Sie können zum Beispiel auch übereinstimmen Portnummern, nicht nur IP-Adressen.

Speichern und Wiederherstellen von IP-Sets wie bei iptables-save und iptables-restore

Sie können IP-Mengen-Deklarationen in großen Mengen erstellen und sie importieren, indem Sie sie in die Datei leiten ipset restore. Wenn Sie Ihren Befehl widerstandsfähiger gegen bereits vorhandene Einträge machen möchten, verwenden Sie ipset -exist restore.

Wenn Ihre Regeln in einer Datei namens sind default.set Sie würden verwenden:

ipset -exist restore < default.set

Eine Datei wie diese kann Einträge enthalten create Sets und zu add Einträge in sie. Im Allgemeinen scheinen jedoch die meisten Befehle von der Befehlszeile eine entsprechende Version in den Dateien zu haben. Beispiel (Erstellen einer Gruppe von DNS-Servern):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

Hier wird ein Satz für IPv4 erstellt (dns4) und eine für IPv6 (dns6).

Timeouts bei IP-Gruppen

Timeouts in IP-Sets können als Standard pro Set und auch pro Eintrag festgelegt werden. Dies ist sehr nützlich für Szenarien, in denen Sie jemanden vorübergehend blockieren möchten (z. B. für Port-Scans oder den Versuch, Ihren SSH-Server brutal zu erzwingen).

Die Funktionsweise ist wie folgt (Standard bei der Erstellung von IP-Sets):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

Wir kommen zurück zu diesen speziellen Sets und der Begründung, warum sie so eingestellt sind, wie sie sind.

Wenn Sie Ihr Timeout für eine bestimmte IP-Adresse festlegen möchten, können Sie einfach sagen:

add ssh_dynblock4 1.2.3.4 timeout 7200

Um IP 1.2.3.4 für zwei Stunden statt der (voreingestellten) Standardhalbstunde zu blockieren.

Wenn du das mit ansehen würdest ipset save ssh_dynblock4 Nach kurzer Zeit siehst du etwas in der Art von:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

Timeout-Vorbehalte

  • Timeouts sind ein Feature in einem bestimmten Set. Wenn der Satz nicht war erstellt mit Timeout-Unterstützung erhalten Sie einen Fehler (z. Kernel error received: Unknown error -1).
  • Timeouts werden in Sekunden angegeben. Verwenden Sie Bash-arithmetische Ausdrücke, um beispielsweise von Minuten zu Sekunden zu gelangen. Z.B.: sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Prüfen, ob ein Eintrag in einem bestimmten IP-Set existiert

Innerhalb Ihrer Skripte kann es nützlich sein zu sehen, ob ein Eintrag bereits existiert. Dies kann mit erreicht werden ipset test Das gibt Null zurück, wenn der Eintrag existiert und andernfalls nicht Null. So können die üblichen Prüfungen in einem Skript angewendet werden:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

In vielen Fällen möchten Sie jedoch lieber das -exist wechseln zu ipset um es zu veranlassen, sich nicht über bestehende Einträge zu beschweren.

Auffüllen von IP-Sets von iptables Regeln

Dies ist meiner Meinung nach eines der wichtigsten Merkmale von IP-Sets. Sie können nicht nur mit den Einträgen eines IP-Sets übereinstimmen, sondern auch einem bestehenden IP-Set neue Einträge hinzufügen.

Zum Beispiel in diese Antwort zu dieser Frage haben Sie:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... mit der Absicht, Verbindungsversuche zu SSH (TCP-Port 22) zu begrenzen. Das verwendete Modul recent verfolgt die letzten Verbindungsversuche. Anstatt der state Modul, ich bevorzuge die conntrack Modul jedoch.

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

In diesem Fall leite ich den Fluss auf die SSH Kette, mit der ich mich nicht wiederholen muss -p tcp --dport ssh für jede einzelne Regel.

Wiederholen:

  • -m set macht iptables bewusst, dass wir Schalter von der verwenden set Modul (das IP-Sets behandelt)
  • --match-set ssh_dynblock4 src erzählt iptablesdem entsprechen Quelle (src) Adresse gegen die benannte Menge (ssh_dynblock4)
    • das entspricht sudo ipset test ssh_dynblock4 $IP (woher $IP enthält die Quell-IP-Adresse für das Paket
  • -j SET --add-set ssh_dynblock4 src --exist fügt hinzu oder aktualisiert das Quelle (src) Adresse aus dem Paket in den IP-Satz ssh_dynblock4. Wenn ein Eintrag existiert (--exist) Es wird einfach aktualisiert.
    • das entspricht sudo ipset -exist add ssh_dynblock4 $IP (woher $IP enthält die Quell-IP-Adresse für das Paket

Wenn Sie stattdessen die Ziel- / Zieladresse anpassen möchten, verwenden Sie dst anstatt src. Weitere Informationen finden Sie im Handbuch.

Sätze von Sätzen

IP-Sets können andere Sets enthalten. Nun, wenn Sie den Artikel bis hierhin verfolgt haben, haben Sie sich gefragt, ob es möglich ist, Sets zu kombinieren. Und natürlich ist es. Für die IP-Sets von oben können wir zwei gemeinsame Sets erstellen ssh_dynblock und ssh_loggedon jeweils die IPv4-Only- und IPv6-Only-Sets zu enthalten:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

Und die nächste Frage, die Ihnen in den Sinn kommen sollte, ist, ob dies uns erlaubt Spiel und manipulieren IP-Sets in einer IP-Version-agnostic Mode.

Und die Antwort darauf ist überwältigend: JA! (Leider wurde dies beim letzten Mal nicht explizit dokumentiert)

Folglich können die Regeln aus dem vorherigen Abschnitt neu geschrieben werden:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Das ist viel prägnanter. Und ja, das ist erprobt und funktioniert wie ein Zauber.

Alles zusammen: SSH Brute-Force-Verteidigung

Auf meinen Servern habe ich ein Skript als ausgeführt cron Job, der eine Reihe von Host-Namen akzeptiert und diese in IP-Adressen auflöst und sie dann in die IP-Liste für "vertrauenswürdige Hosts" eingibt. Die Idee ist, dass vertrauenswürdige Hosts mehr versuchen, sich beim Server anzumelden, und nicht unbedingt so lange blockiert werden wie sonst irgendjemand.

Umgekehrt habe ich ganze Länder blockiert von der Verbindung zu meinem SSH-Server, mit der (potenziellen) Ausnahme von vertrauenswürdigen Hosts (d. H. Reihenfolge der Regeln ist wichtig).

Das ist jedoch eine Übung für den Leser. Hier möchte ich eine saubere Lösung hinzufügen, die die in der ssh_loggedon festgelegt, um zuzulassen, dass nachfolgende Verbindungsversuche durchgeführt werden, und nicht der gleichen Prüfung wie die anderen Pakete unterzogen werden.

Es ist wichtig, sich an die Standard-Zeitüberschreitungen von 90 Minuten zu erinnern ssh_loggedon und 30 Minuten für ssh_dynblock wenn man das folgende betrachtet iptables Regeln:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Jetzt sollten Sie sich fragen, wie die IP - Adresse in der ssh_loggedon Untergruppen. Also lies weiter ...

Bonus: Hinzufügen der IP, mit der Sie sich während der SSH-Anmeldung anmelden

Wenn Sie experimentiert haben sshrc und Freunde, du wirst von seinen Unzulänglichkeiten erfahren haben. Aber PAM kommt zur Rettung. Ein Modul namens pam_exec.so ermöglicht uns, ein Skript während der SSH-Anmeldung an einem Punkt aufzurufen, an dem wir wissen, dass der Benutzer zugelassen ist.

Im /etc/pam.d/sshd unter dem pam_env und pam_selinux Einträge fügen die folgende Zeile hinzu:

session    optional     pam_exec.so stdout /path/to/your/script

und stellen Sie sicher, dass Ihre Version des Skripts (/path/to/your/script oben) existiert und ist ausführbar.

PAM verwendet Umgebungsvariablen, um zu kommunizieren, was vor sich geht. Sie können also ein einfaches Skript wie dieses verwenden:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

Leider die ipset Das Dienstprogramm scheint die integrierten Smart-Funktionen von netfilter nicht zu besitzen. Daher müssen wir beim Hinzufügen unseres Eintrags zwischen IPv4 und IPv6 unterscheiden. Andernfalls ipset Wir nehmen an, dass wir einen weiteren hinzufügen möchten einstellen zu der Reihe von Sätzen, anstatt der IP. Und natürlich ist es unwahrscheinlich, dass es einen Satz geben würde, der nach einer IP benannt ist :)

Also schauen wir nach : in der IP-Adresse und anhängen 6 in diesem Fall zum festgelegten Namen und 4 Andernfalls.

Das Ende.


3