it-swarm.com.de

iptables Tipps & Tricks

Ich bin sicher, Linux-Systemadministratoren kennen iptables, die Benutzeroberfläche für netfilter Paketfilter-Framework.

Diese "Frage" soll nun ein Community Wiki sein, um verschiedene Bits-n-Pieces von iptables Weisheit zusammenzutragen. Nichts ist zu häufig oder zu dunkel. Veröffentlichen Sie alles, was Sie wissen, um anderen zu helfen, iptables optimal zu nutzen.

61
pepoluan

Optimieren Sie die Leistung des Netzfilters mit ipset

Wenn Sie eine Menge ähnlicher Regeln schreiben, die auf bloßer IP, Port oder beiden basieren, sollten Sie ipset verwenden, um die Leistung des Netzfilters 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 Hunderte Regeln durchlaufen muss, bevor es das Urteil ACCEPT erhalten kann.

Erfahrene Systemadministratoren teilen die Regeln natürlich nach Subnetzen auf. Aber das immer noch bedeutet Hunderte von Regeln.

ipset zur Rettung!

Definieren Sie zunächst einen IP-Satz vom Typ ipmap:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Füllen Sie es dann mit den Adressen:

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

Ersetzen Sie abschließend die oben genannten Hunderte von iptables-Regeln durch eine Regel:

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

Wenn ein Paket eintrifft, führt netfilter eine sehr schnelle Bitmap-Suche nach der Quell-IP (src) des Pakets anhand des IP-Sets Allowed_Hosts Durch. Für alle Pakete, die von 192.168.0.0/16 kommen, gilt eine Regel. Und glauben Sie mir, dass das Durchsuchen einer Bitmap mindestens zwei Größenordnungen schneller ist als das Durchfü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 diesen Kriterien als Quelle oder Ziel oder einer Mischung aus beiden entsprechen (im Fall von Tupeln).

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

Weitere Informationen finden Sie in der Manpage von ipset .

SEHR WICHTIGER HINWEIS:

Einige Linux-Distributionen unterstützen möglicherweise nicht "out-of-the-box" für ipset (z. B. hatte Ubuntu 10.04 dieses Problem). Auf diesen Systemen besteht eine Methode darin, ipset aus dem Quellcode zu installieren.

Laden Sie stattdessen die Quelle von ipset von der Website herunter: http://ipset.netfilter.org/install.html

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

26
pepoluan

Verwenden von Whitelist und Blacklist mit iptables

#!/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

Schlumpfangriffe blockieren

# 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

ICMP blockieren (auch bekannt als Ping)

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

Fügen Sie Ihren Regeln Kommentare hinzu:

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

Bekannte blockieren 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 jeweils:

  • SYN-FIN-Angriff
  • SYN-RST-Angriff
  • Weihnachtsangriff
  • nmap FIN-Scan
  • NULLflags greifen an
  • ALLflags greifen an

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

17
pepoluan

NAT aktivieren

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

In Schritt 1 wird der Kernel-Parameter festgelegt, um die IP-Weiterleitung zu ermöglichen. In Schritt 2 wird eine iptables-Regel eingerichtet, die NAT auf der Schnittstelle eth0) aktiviert.

7

Blockieren Sie 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 niemals fragmentiert werden; sie sollten kleine Nutzdaten tragen.)

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

6
pepoluan

(aus meiner Datei iptables_tricks.txt, die an vielen Stellen 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
5
boris quiroz

using FireHOL - praktischer iptables-Wrapper

Ich fand es viel intuitiver als direkte iptables-Befehle. Speziell für Personen mit früheren Erfahrungen mit anderen Firewalls:

FireHOL ist ein Iptables-Firewall-Generator, der Stateful Iptables-Paketfilter-Firewalls auf Linux-Hosts und -Routern mit einer beliebigen Anzahl von Netzwerkschnittstellen, einer beliebigen Anzahl von Routen, einer beliebigen Anzahl von Diensten und einer beliebigen Anzahl von Komplexitäten zwischen Variationen der Dienste (einschließlich positiver und negativer) erzeugt Ausdrücke).

4
Ophir Yoktan

IP-Sets überarbeitet

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

Notation unten verwendet

Für ipset verwende ich die von ipset restore Gelesene und von ipset save Geschriebene Notation.

Entsprechend für iptables (und ip6tables) Regeln werde ich die von iptables-restore Gelesene und von iptables-save Geschriebene Notation verwenden. Dies führt zu einer kürzeren Notation und ermöglicht es mir, potenzielle Nur-IPv4-Regeln (vorangestellt -4) Oder Nur-IPv6-Regeln (vorangestellt -6) Hervorzuheben.

In einigen Beispielen leiten wir den Paketfluss in eine andere Kette um. Es wird angenommen, dass die Kette an diesem Punkt vorhanden ist, sodass die Zeilen zum Erstellen der Ketten nicht erzeugt werden (noch wird der Tabellenname erwähnt oder die Befehle COMMIT am Ende angegeben).

Erweiterte IP-Sätze

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

Zum Beispiel werde ich mich hauptsächlich auf drei Mengenarten konzentrieren: hash:ip, hash:net Und list:set, Aber es gibt mehr als diese und alle haben gültige Anwendungsfälle.

Sie können beispielsweise auch Portnummern abgleichen, nicht nur IP-Adressen .

Speichern und Wiederherstellen von IP-Sätzen wie bei iptables-save Und iptables-restore

Sie können IP-Set-Deklarationen in großen Mengen erstellen und importieren, indem Sie sie in ipset restore Weiterleiten. Wenn Sie Ihren Befehl gegenüber bereits vorhandenen Einträgen widerstandsfähiger machen möchten, verwenden Sie ipset -exist restore.

Wenn sich Ihre Regeln in einer Datei mit dem Namen default.set Befinden, würden Sie Folgendes verwenden:

ipset -exist restore < default.set

Eine solche Datei kann Einträge zu create Sets und zu add Einträgen enthalten. Im Allgemeinen scheinen die meisten Befehle über die Befehlszeile eine entsprechende Version in den Dateien zu haben. Beispiel (Erstellen einer Reihe 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 (dns4) Und einer für IPv6 (dns6) Erstellt.

Zeitüberschreitungen bei IP-Sets

Zeitüberschreitungen in IP-Sätzen können standardmäßig pro Satz 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. zum Port-Scannen oder zum Versuch, Ihren SSH-Server brutal zu erzwingen).

Dies funktioniert folgendermaßen (Standard bei der Erstellung von IP-Sätzen):

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 werden im Folgenden auf diese speziellen Sets und die Gründe zurückkommen, 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

So blockieren Sie IP 1.2.3.4 für zwei Stunden anstelle der (festgelegten) Standardhalbstunde.

Wenn Sie sich das nach kurzer Zeit mit ipset save ssh_dynblock4 Anschauen würden, würden Sie 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

  • zeitüberschreitungen sind eine Funktion für jeden Satz. Wenn das Set nicht erstellt mit Timeout-Unterstützung war, erhalten Sie eine Fehlermeldung (z. B. Kernel error received: Unknown error -1).
  • zeitüberschreitungen werden in Sekunden angegeben. Verwenden Sie Bash-Arithmetikausdrücke, um beispielsweise von Minuten auf Sekunden zu gelangen. Zum Beispiel: Sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Überprüfen, ob ein Eintrag in einem bestimmten IP-Satz vorhanden ist

In Ihren Skripten kann es hilfreich sein, festzustellen, ob bereits ein Eintrag vorhanden ist. Dies kann mit ipset test Erreicht werden, das Null zurückgibt, wenn der Eintrag vorhanden ist, andernfalls ungleich 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 den Schalter -exist Auf ipset verwenden, um ihn anzuweisen, sich nicht über vorhandene Einträge zu beschweren.

Auffüllen von IP-Sätzen aus iptables Regeln

Dies ist meiner Meinung nach eines der Killer-Features von IP-Sets. Sie können nicht nur mit den Einträgen eines IP-Satzes übereinstimmen, sondern auch einem vorhandenen IP-Satz neue Einträge hinzufügen.

Zum Beispiel in diese Antwort auf diese 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. Anstelle des Moduls state bevorzuge ich jedoch das Modul conntrack.

# 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 in die Kette SSH um, sodass ich mich nicht für jede einzelne Regel mit -p tcp --dport ssh Wiederholen muss.

Wiederholen:

  • -m set Macht iptables darauf aufmerksam, dass wir Switches aus dem Modul set verwenden (das IP-Sätze verarbeitet).
  • --match-set ssh_dynblock4 src Weist iptables an, die Adresse source (src) mit der benannten Menge (ssh_dynblock4)
    • dies entspricht Sudo ipset test ssh_dynblock4 $IP (wobei $IP die Quell-IP-Adresse für das Paket enthält).
  • -j SET --add-set ssh_dynblock4 src --exist Fügt die Adresse source (src) aus dem Paket in den IP-Satz ssh_dynblock4 Hinzu oder aktualisiert sie. Wenn ein Eintrag vorhanden ist (--exist), Wird er einfach aktualisiert.
    • dies entspricht Sudo ipset -exist add ssh_dynblock4 $IP (wobei $IP die Quell-IP-Adresse für das Paket enthält).

Wenn Sie stattdessen die Ziel-/Zieladresse abgleichen möchten, verwenden Sie dst anstelle von src. Weitere Optionen finden Sie im Handbuch.

Sätze von Sätzen

IP-Sets können andere Sets enthalten. Wenn Sie dem Artikel bis hierher gefolgt sind, haben Sie sich gefragt, ob es möglich ist, Sets zu kombinieren. Und natürlich ist es das. Für die IP-Sätze von oben können wir zwei gemeinsame Sätze ssh_dynblock Und ssh_loggedon Erstellen, die nur IPv4- und nur IPv6-Sätze 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 sich in Ihrem Kopf stellen sollte, ist, ob dies uns erlaubt, match und IP-Sets in einer IP-version-agnostischen Weise zu manipulieren.

Und die Antwort darauf ist ein klares: JA! (leider wurde dies beim letzten Überprüfen nicht explizit dokumentiert)

Folglich können die Regeln aus dem vorherigen Abschnitt wie folgt umgeschrieben 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 hat sich bewährt und funktioniert wie ein Zauber.

Alles zusammen: SSH Brute-Force-Verteidigung

Auf meinen Servern wird ein Skript als cron Job ausgeführt, der eine Reihe von Hostnamen verwendet und diese in IP-Adressen auflöst und dann in den IP-Satz für "vertrauenswürdige Hosts" einspeist. Die Idee ist, dass vertrauenswürdige Hosts mehr Versuche erhalten, sich beim Server anzumelden, und nicht unbedingt so lange blockiert werden wie alle anderen.

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

Dies bleibt jedoch als Übung für den Leser. Hier möchte ich eine übersichtliche Lösung hinzufügen, die die im ssh_loggedon - Set enthaltenen Sets verwendet, um nachfolgende Verbindungsversuche zu ermöglichen und nicht der gleichen Prüfung wie die anderen Pakete zu unterliegen.

Es ist wichtig, die Standardzeitlimits von 90 Minuten für ssh_loggedon Und 30 Minuten für ssh_dynblock Zu beachten, wenn Sie die folgenden iptables Regeln beachten:

-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

Inzwischen sollten Sie sich fragen, wie die verbindende IP-Adresse in den Untergruppen ssh_loggedon Endet. Also lesen Sie weiter ...

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

Wenn Sie mit sshrc und Freunden experimentiert haben, haben Sie von den Mängeln erfahren. Aber PAM kommt zur Rettung. Mit einem Modul namens pam_exec.so Können wir ein Skript während der SSH-Anmeldung an einem Punkt aufrufen, an dem wir wissen, dass der Benutzer zugelassen ist.

Fügen Sie in /etc/pam.d/sshd Unter den Einträgen pam_env Und pam_selinux 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) vorhanden und ausführbar ist.

PAM verwendet Umgebungsvariablen, um zu kommunizieren, was gerade passiert. 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 scheint das Dienstprogramm ipset nicht über die integrierten Funktionen von netfilter zu verfügen. Daher müssen wir beim Hinzufügen unseres Eintrags zwischen IPv4- und IPv6-IP-Sätzen unterscheiden. Andernfalls geht ipset davon aus, dass wir anstelle der IP einen weiteren Satz Zum Satz hinzufügen möchten. Und natürlich ist es unwahrscheinlich, dass es einen Satz gibt, der nach einer IP benannt ist :)

Also suchen wir in der IP-Adresse nach : Und hängen in diesem Fall 6 An den festgelegten Namen an, andernfalls 4.

Das Ende.

4
0xC0000022L
4
Registered User

Eine andere GUI, die zum Konfigurieren von iptables verwendet werden kann, ist Firewall Builder . Benutzer können Regelelemente als Objekte in einer Datenbank erstellen und diese Objekte dann per Drag & Drop in einen Regeleditor ziehen, um die gewünschte Firewallrichtlinie zu erstellen. Die Anwendung generiert dann eine Skriptdatei mit allen iptables-Befehlen, die zum Implementieren der Regeln erforderlich sind.

Im Gegensatz zu einigen anderen iptables-GUI-Lösungen, bei denen Sie jeweils nur eine iptables-Konfiguration verwalten können, können Sie mit Firewall Builder eine große Anzahl von iptables-Konfigurationen von einer einzigen Anwendung aus verwalten. Firewall Builder läuft unter Linux, Windows und Mac OS X, gibt es seit über 10 Jahren und hat Tausende von aktiven Benutzern auf der ganzen Welt.

Vollständige Offenlegung - Ich bin Mitbegründer von NetCitadel, dem Unternehmen, das Firewall Builder entwickelt.

3
Mike H.

Ordnen Sie mehrere Schnittstellennamen einem Platzhalter zu

Beispiel: Sie haben eth0ndeth1 Und möchten Datenverkehr zwischen ihnen zulassen?

iptables -A FORWARD -i eth+ -o eth+ -j ACCEPT

Ich habe dies in der Vergangenheit verwendet, um die von LXC dynamisch erstellten und benannten veth<something> - Schnittstellen abzugleichen. So kann ich auf einmal mit veth+ Abgleichen.

Ich habe auch absichtlich einige Schnittstellen _<something> Benannt, um mit _+ Abzugleichen.

2
0xC0000022L

Beschränkung aller einzelnen IP-Adressen auf ein ausgehendes Bandbreitenkontingent mit IP-Sätzen

Sie können Ihren Server so konfigurieren, dass nur jede einzelne IP 15GiByte Bandbreitennutzung pro Monat zugelassen wird, in der Hoffnung, einen Angriff auf die Bandbreitennutzung zu reflektieren oder auszuweichen, möglicherweise für Ihr gemessenes Bandbreitenkontingent bei Ihrem ISP. Dies kann wie folgt erreicht werden:

Erstellen Sie zuerst die IP-Sätze für IPv4 und IPv6:

ipset create IP_QUOTA_SET_OUT hash:ip timeout 345600 counters
ipset create IP_QUOTA_SET_OUT_INET6 hash:ip timeout 345600 counters family inet6

Fügen Sie nun Ihre iptables-Regeln hinzu. In der ersten Zeile wird die IP zum Satz hinzugefügt, falls sie noch nicht vorhanden ist. Die zweite Zeile stimmt nicht überein, wenn die für die IP im Satz übertragenen Bytes größer als der angegebene Betrag sind. Das Gleiche gilt für IPv6.

iptables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT dst -j SET --add-set IP_QUOTA_SET_OUT dst --timeout 345600
iptables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT dst --bytes-gt 16106127360 -j DROP

ip6tables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT_INET6 src -j SET --add-set IP_QUOTA_SET_OUT_INET6 src --timeout 345600
ip6tables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT_INET6 src --bytes-gt 16106127360 -j DROP

Auf diese Weise werden Angriffe verhindert, bei denen ein Benutzer über einen längeren Zeitraum eine große Datei von Ihrem Webserver oder von einem anderen Dienst anfordert. Gleiches gilt für die INPUT-Kette.

2
infinmed

protokollieren Sie die ausgehende Verbindung mit der UID

iptables -A OUTPUT -m state --state NEW -m tcp -p tcp -m limit --limit 5/m -j LOG --log-uid --log-prefix="outgoing connection: "

port-/Verbindungsweiterleitung:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.1.7:80
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -i eth1 -j ACCEPT
2
kofemann

Blockieren Sie ungewöhnliche MSS-Werte

iptables -t mangle -A PREROUTING -p tcp \
-m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

SYNPROXY-Ziel für den DDos-Schutz

Der Zweck dieses Ziels besteht darin, zu überprüfen, ob der Host, der das SYN-Paket gesendet hat, die Verbindung herstellt oder nach dem Initiieren der SYN-Verbindung nichts unternimmt. Wenn es nichts tut, verwirft es das Paket mit minimalem Aufwand.

Setzen Sie Syn-Pakete in der Raw-Tabelle auf die Verbindungsverfolgungstabelle

iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 --syn -j CT --notrack

Aktivieren Sie den Synproxy für den http-Server:

iptables -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate INVALID,UNTRACKED \
-j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460

Ressource: SYNPROXY-Ziel aus dem RHEL-Blog

1
fugitive

Ich stimme den Kommentaren zu ipsets und tcp-Flags zu, aber es fehlt noch viel:

Verwenden Sie für Länderlisten xtables-addons geoip match anstelle von ipsets. Aktualisieren Sie die Geoip-Daten regelmäßig (mindestens einmal pro Monat). Die Daten sind dynamischer als eine Fire-and-Forget-Ipset-Liste.

Betrachten Sie die Verbindungsstatusverfolgung mit TCP-Flags. Beispielsweise ist ein TCP-RST oder ACK nur für eine hergestellte Verbindung sinnvoll. SYN ist nur für neue und verwandte Verbindungen sinnvoll. Eine SYN für eine hergestellte Verbindung bedeutet, dass entweder Ihre SYN + ACK verloren gegangen ist oder ein Hackversuch unternommen wurde. Sie sollte zurückgesetzt werden, da beide Seiten der Verbindung sich nicht auf den Status einigen.

Obwohl keine, SYN + RST und FIN + RST unzulässige Kombinationen sind, ist SYN + FIN jetzt unter TCP Fast-Open (TCP-Option 34) gültig, insbesondere für DNS. SYN-Pakete, auch mit Fast -open, sollte nicht fragmentiert werden. Ich halte Regeln mit den PSH- und URG-Flags nicht für nützlich. Verwechseln Sie den Verbindungsverfolgungsstatus nicht mit TCP Status: Eine RST-Antwort auf ein SYN-Paket ist zu Verfolgungszwecken eingerichtet.

SYNPROXY ist für weitergeleitete Pakete und fügt nichts für lokal zugestellte Pakete hinzu, außer für die Syncookie-Unterstützung.

ICMP-Fehlerpakete befinden sich immer im zugehörigen Status und haben eine Länge von 48: 576, wenn sie gültig sind. Länge 84: 1280 für IPv6. Alle anderen sollten ignoriert werden. Da ihre maximale Größe auch die minimale MTU ist, sollten sie niemals fragmentiert werden. ICMP-Anforderungen (Pings, Zeitstempel usw.) sind immer neu und Antworten werden erstellt. Verwerfen Sie ICMP-Pakete in anderen Zuständen.

Wie im SSH-Beispiel mit einer aktuellen Liste, in der nur nachfolgende SYN-Pakete akzeptiert werden, sollte dies auch für SMTP erfolgen. Dies ähnelt dem „Greylisting“ nur für das IP-Adressdatum.

In der Filtertabelle sollte die erste Regel (oder die zweite, wenn zuerst festgelegte Statuspakete akzeptiert werden) in der Eingabe- und Ausgabekette alles auf der Loopback-Schnittstelle akzeptieren. Sie sollten Ihren eigenen internen Paketen vertrauen. Wenn Sie dies nicht können, haben Sie größere Probleme als bei einer Firewall-Lösung.

Kopieren Sie Regeln nicht blind, es sei denn, Sie verstehen wirklich, was sie tun. So viele ähnliche Regellisten tun das, und meistens ist das Ergebnis lächerlich.

0
MR.X