
Verwenden vonrecent
Modul in iptables
: Wie kann ich sowohl prüfen, ob die Quell-IP-Adresse in einer Liste vorhanden ist, als auch sie, wenn ja, einer anderen Liste hinzufügen?
Ich versuche umzusetzenHafenklopfenVerwendung iptables
zusammen mit diesem Modul ( recent
).
Ich möchte also feststellen, ob TCP-Pakete in einer bestimmten Reihenfolge ankommen, indem ich die Quell-IP-Adresse von einer Liste in eine andere verschiebe und sie so in Richtung der endgültigen Liste fortschreite, die der Quell-IP den Zugriff auf die Maschine ermöglichen würde.
Meine Frage ist im Wesentlichen, wie man die Quell-IP zu einem nächsten Schritt (Liste) hinzufügt, wenn ein Paket den richtigen Zielport hat UND sich im richtigen aktuellen Schritt (Liste) befindet, und das alles in einer Regel. So etwas wie das hier:
1:
# we'd like to accept the already authenticated packets quickly, hence the first rule
iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT
2:
# src ip is not authenticated, let's verify the first knock
# if the first port knock was correct (port 1111), add the src ip to the 'knock1' list
iptables -A KNOCKING -p tcp --dport 1111 -m recent --name knock1 --set -j DROP
3:
# now, here is the issue...
# how do we both check if the src ip is already in the 'knock1' list
# plus the second port knock was correct (port 2222), and add the src ip to 'knock2' list
# ideally, we would write something like this
iptables -A KNOCKING -m recent --rcheck --seconds 10 --reap --name knock1 -p tcp --dport 2222 -m recent --name knock2 --set -j DROP
Ich habe von mehreren unterschiedlichen Ansätzen zum Einrichten von Port-Knocking mit iptables gelesen, aber dieser erschien mir am trivialsten, daher möchte ich wirklich bestätigen oder verneinen, dass es mit diesem Ansatz möglich ist.
Antwort1
Wie sich herausstellte, ist die Zeile, die ich oben gepostet habe, genau so, wie sie geschrieben werden sollte :) Ich schätze, ich war zu pessimistisch in der Erwartung, iptables
eine so „komplexe“ Regel verarbeiten zu können.
Hier ist meine Konfiguration für die einfache Port-Knocking-Konfiguration:
# set default policy for INPUT chain to DROP
iptables -P INPUT DROP
# accept all local traffic
iptables -A INPUT -i lo -j ACCEPT
# accept all the already-established connections
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m multiport --sports 25,80,443,465,587 -j ACCEPT
# add more of your own rules here...
# at the end, redirect all the packets into the KNOCKING chain
# this makes it easy to quickly enable/disable KNOCKING chain, if need be
iptables -A INPUT -j KNOCKING
# if the src ip is already authenticated, accept it
iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT
# if the packet is not authenticated and the first port knock is correct
# add the src ip into the 'knock1' list
iptables -A KNOCKING -p tcp -m tcp --dport 1111 -m recent --set --name knock1 -j DROP
# if the src ip is already in the 'knock1' list (with the expiry time of 10 seconds)
# and the 2nd port knock is correct, add the src ip to the 'knock2' list
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock1 -m tcp --dport 2222 -m recent --set --name knock2 -j DROP
# if the src ip is already in the 'knock2' list (with the expiry time of 10 seconds)
# and the 3rd port knock is correct, add the src ip to the 'knock3' list
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock2 -m tcp --dport 3333 -m recent --set --name knock3 -j DROP
# if the src ip is already in the 'knock3' list (with the expiry time of 10 seconds)
# and the 4th port knock is correct, add the src ip to the 'knockfinal' list
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock3 -m tcp --dport 4444 -m recent --set --name knockfinal -j DROP
# otherwise, we don't do anything and the default INPUT policy will drop the packet
Ich schätze, das ist der kürzeste Port-Knocking-Regelsatz für iptables, den ich bisher gesehen habe ...