Ich bin neu bei Ubuntu, nachdem ich vom Hosting auf CentOS7 umgestiegen bin, wo iptables verwendet wurde, und ich war zufrieden damit, wie apf und bfd iptables vor mir verarbeiteten (versteckten) ... und es funktionierte gut
Ich bin also auf Ubuntu (20.04 LSR) umgestiegen und die „Ubuntu-Methode“, um eine Firewall mit automatischem Sperren von Einbruchsversuchen einzurichten, scheint nftables und fail2ban zu sein.
Ich habe iRedMail verwendet, um einen einfachen Mailserver auf Basis von nginx, postfix, dovecot, clamav, roundcube usw. einzurichten, und es hat fail2ban so konfiguriert, dass die Protokolle auf Versuche überwacht werden, sich in die Mail-Dienste und SSH usw. einzuhacken. Ich habe gesehen, dass es meine Mail-Protokolle korrekt analysiert und die von fail2ban blockierten IPs in der Tabelle inet f2b-table speichert.
Dies übersteht einen Neustart problemlos, aber mir ist aufgefallen, dass die Datei /etc/nftables.conf keine der Fail2ban-Tabellen enthält - sie enthält meine Basis-Firewall, die ich statisch aktualisieren kann, um alle TCP-Ports zu sperren und dann wieder freizugeben, die ich möchte (im Wesentlichen Mail, Webserver und SSH).
Aber soweit ich sehen kann, befinden sich die Fail2ban-Regeln nicht in einer Konfigurationsdatei, sondern scheinen beim Booten aus Einträgen in einer Fail2ban-Tabelle in einer von iRedMail eingerichteten MySQL-Datenbank rekonstruiert zu werden
Das ist in Ordnung, aber hier ist das Dilemma: Wenn ich der Firewall manuell eine Regel hinzufüge, die die vorhandene Tabelle für Fail2Ban nutzt, kann ich …
nft add element inet f2b-table addr-set-postfix-pregreet { spammer.ip.addr.here }
Es wird angezeigt und funktioniert. Ich habe es getestet, indem ich mich erfolgreich ausgesperrt und es dann über die lokale Konsole entfernt habe.
Außer wenn ich neu starte, geht die gesamte Tabelle verloren und wird von fail2ban aus den Tabelleneinträgen neu erstellt (auch das ist für mich ok).
Also habe ich meinen eigenen neuen Tisch/Sachen hinzugefügt
table inet spammers {
set blackhole {
type ipv4_addr
elements = { sample.ip.addr.here }
}
chain spammers-chain {
type filter hook input priority filter - 2; policy accept;
ip saddr @blackhole drop
}
}
Ich habe es noch einmal getestet und es funktioniert gut, aber um es dauerhaft bereitzustellen, muss ich es in /etc/nftables.conf schreiben oder dieses Verzeichnis so einrichten, dass meine Regeln usw. eingelesen werden können.
Ich könnte dies tun, indem ich in meiner nftables.conf einen Include zu einem Verzeichnis mit beliebigen Regeln hinzufüge und dann meine Tabelle jedes Mal dort speichere, wenn ich eine Adresse hinzufüge, aber das scheint hässlich und falsch
Wenn ich einen neuen Spammer zu meiner Liste hinzufügen möchte, kann ich
nft add element inet spammers blackhole { new.ip.addr.here }
aber dann müsste ich... ich weiß nicht? die Tabelle in meiner Datei persistieren?
nft list table inet spammers > /etc/nftables.d/spammers.conf
Das ist also eine Möglichkeit, wie ich es machen könnte, aber ich habe andere über netfilter-persist reden hören, aber das ist nicht Teil von Ubuntu. Also bevor ich entweder mein eigenes Rad erfinde oder mich in den Kaninchenbau von netfilter-persist vertiefe oder (nein danke) etwas Ähnliches mache, wie es fail2ban anscheinend gemacht hat... (die gesperrten IPs in einer Datenbank speichern und die Liste beim Login rekonstruieren),
Mir fallen mehrere Möglichkeiten ein, wie ich das machen könnte, aber ich frage mich, ob es eine „Best Practice“ – eine „Ubuntu-Methode“ – gibt, die mir hier fehlt …
UPDATE/EDIT: Sofern ich keinen besseren Vorschlag bekomme, ist meine "Lösung" im Moment
mkdir /etc/nftables.d/
nft list table inet spammers > /etc/nftables.d/spammers.conf
und dann habe ich meine /etc/nftables.conf bearbeitet, um diese Zeile unten hinzuzufügen
include "/etc/nftables.d/*.conf"
Wenn ich jetzt einen Block zur Tabelle hinzufüge, sind dafür zwei Schritte erforderlich:
nft add element inet spammers blackhole { some.evildoer.ip.address }
nft list table inet spammers > /etc/nftables.d/spammers.conf
Es ist nicht das Schönste, aber es funktioniert absolut. Ich könnte das alles natürlich in mein eigenes benutzerdefiniertes Skript einbinden, sodass ich einfach etwas wie
banspammer "badguy.ip.addr.here"
und Banspammer würde das angegebene Adresselement hinzufügen und die aktualisierte Tabellendefinition speichern …
Auch hier fühlt es sich einfach „nicht wie eine bewährte Methode“ an, daher meine Frage.
BEARBEITEN: 22.12.2021 OK, also ich rede sozusagen mit mir selbst, aber da ich kein Feedback bekommen habe, bin ich bei meiner Idee geblieben – sie funktioniert und ich habe dieses kleine Banspammer-Skript geschrieben … es ist roh und wahrscheinlich hochgefährlich – ich habe keine Plausibilitätsprüfungen durchgeführt, wie mir etwa die Mühe gemacht zu prüfen, ob der Pfad der Konfigurationsdatei gültig ist und habe keine Sicherungskopie der besagten Datei erstellt usw …
Da der Tabelleneintrag vom Typ ipv4_addr ist, führt nftables eine Validierung durch, also mache ich mir darüber keine allzu großen Sorgen
BEACHTEN Sie, dass mein spezielles Setup bereits einen Filter namens Filter in der Inet-Familie hatte - ich füge diesen speziell als eine etwas niedrigere Prioritätsliste hinzu. Ich habe auch das Verzeichnis /etc/nftables.d erstellt und meinen Code hinzugefügt, damit es das Konfigurationsverzeichnis analysiert, wie ich oben erwähnt habe
Wir hoffen, dass jemand dies nützlich findet.
Ich wäre dennoch an einem eher „Ubuntu-ähnlichen Weg“ interessiert, falls es so etwas gäbe.
#!/usr/bin/sh
################################################################################
# banspammer 2021-12-22 DigitalSorceress
#
# SUMMARY
# This script adds an ip or range of Ips (see element adding) to nftables
# specifically to my spammer blackhole
# it also persists it out to /etc/nftables.d/spammers.conf
#
# put this somewhere like /root/tandautils
# then go to /user/local/sbin and ln -s /root/tandautils/banspammer.sh banspammer
#
################################################################################
# Handle command line args
COMMAND=$1
ADDRESS=$2
# the location of the ssh daemon config file
# default for CentOS is CONFIG_FILE=/etc/ssh/sshd_config
#
CONFIG_FILE=/etc/nftables.d/spammers.conf
# Here are the subroutines for individual actions
ban_spammer () {
# Issue the basic command to ban the spammer
echo "adding spammer to blackhole ..."
nft add element inet spammers blackhole { ${ADDRESS} }
BAN_SPAMMER_RESULT=$?
if [ $BAN_SPAMMER_RESULT -eq 0 ]
then
echo " DONE: ${ADDRESS} added to spammer table"
fi
echo ""
}
unban_spammer () {
# Issue the basic command to ban the spammer
echo "removing spammer from blackhole ..."
nft delete element inet spammers blackhole { ${ADDRESS} }
UNBAN_SPAMMER_RESULT=$?
if [ $UNBAN_SPAMMER_RESULT -eq 0 ]
then
echo " DONE: ${ADDRESS} removed from table"
fi
echo ""
}
persist_spamtable () {
echo "persisting out spamtable to ${CONFIG_FILE}..."
# we need to persist out the spam table to the config
nft list table inet spammers > ${CONFIG_FILE}
if [ $? -eq 0 ]
then
echo " done.. showing table..."
echo ""
nft list table inet spammers
else
echo "error persisting table.. "
fi
echo ""
}
list_spamtable () {
echo "listing out spamtable"
echo ""
nft list table inet spammers
echo ""
}
kill_spamtable () {
echo "resetting /creating blank spamtable ${CONFIG_FILE}..."
#rm -f /etc/nftables.d/spammers.conf
tee /etc/nftables.d/spammers.conf <<EOF
table inet spammers {
set blackhole {
type ipv4_addr
}
chain spammers-chain {
type filter hook input priority filter - 2; policy accept;
ip saddr @blackhole drop
}
}
EOF
echo ""
if [ $? -eq 0 ]
then
echo "success.. here's the new file:"
echo ""
cat /etc/hftables.d/spammers.conf
else
echo "error writing file... "
fi
echo ""
}
help_me () {
echo "This is a tool to simplify blocking of IP addesses of spammers "
echo " "
echo "banspammer 2021-12-22 DigitalSorceress"
echo " "
echo "SUMMARY "
echo " This script is used to simplify the act of adding/removing spammers from "
echo " a spammers table in the nftables ruleset "
echo " "
echo " "
echo "usage: $0 banspammer command [address] "
echo " "
echo " command options: "
echo " ban address "
echo " bans the target address; can be a singe IP or comma sep list "
echo " "
echo " unban address "
echo " removes the target address can be a singe IP or comma sep list "
echo " "
echo " reset "
echo " clears all entries from the spammers table "
echo " note this can be used to create a new empty table "
echo " "
echo " show "
echo " shows the current spam table list "
echo " "
echo " help "
echo " Displays this help dialog "
}
# Here is where we do the actual work based on the passed command
case "$COMMAND" in
ban)
if [ $# -eq 2 ]
then
echo "banning address: ${ADDRESS}"
ban_spammer ${ADDRESS}
if [ $BAN_SPAMMER_RESULT -eq 0 ]
then
persist_spamtable
fi
else
echo "ban command requires a single IP or comma separated list of IPs "
fi
;;
unban)
if [ $# -eq 2 ]
then
echo "unbanning address: ${ADDRESS}"
unban_spammer ${ADDRESS}
if [ $UNBAN_SPAMMER_RESULT -eq 0 ]
then
persist_spamtable
fi
fi
;;
show)
list_spamtable
;;
reset)
kill_spamtable
;;
help)
help_me
;;
*)
echo "Usage: $0 ban|unban comma-separated-ip-list or $0 show|reset"
exit 1
esac
Antwort1
Wenn ja, apt-get install iptables-persistent
wird es eingefügt. netfilter-persistent
Und das scheint das zu sein, wonach Sie gesucht haben, um Ihre Netfilter-Regeln beizubehalten?