GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Blockieren des gesamten Datenverkehrs aus einzelnen Ländern mit IPSet und IPTables

Einführung:
Als ich mir das Syslog ansah, stellte ich zu oft fest, dass SSH-Login-Angriffe entweder aus China oder aus Russland kamen. Davon habe ich genug und erwarte sowieso keinen Traffic aus diesen Ländern, obwohl ich fail2ban verwende Trotzdem habe ich beschlossen, jeglichen Datenverkehr aus diesen beiden Ländern zu blockieren. Fail2ban ist ein großartiges Tool zum Blockieren erfolgloser Anmeldeversuche. ABER es scheint, dass viele Versuche (Tausende) pro Tag immer noch durchlaufen werden. Ich kann nur davon ausgehen, dass der Angreifer parallele Sendeversuche verwendet und bis Fail2ban (basierend auf Auth-Logs) reagiert, sind viele durchgegangen iptables mit einer Regel pro IP-Bereich, ABER das Laden der Regeln hat zu lange gedauert und noch wichtiger, das Laden aller IP-Bereiche als reine iptables-Regeln hat meinen Server instabil gemacht, das heißt … er ist abgestürzt!!! Es wird gesagt, dass mehr als max. 25.000 Regeln in den iptables, insbesondere mehr als 27.000 Regeln, können den Kernel in einen instabilen Zustand versetzen.
Um dem abzuhelfen, verwende ich ipset mit iptables . ipset ist speziell für den Umgang mit großen IP-Range-Listen (Fast Access Hash Tables) konzipiert, die bis zu 65536 Einträge enthalten können.

HINWEIS: Das folgende Skript gilt nur für Debian-basierte Linux-Distributionen. Für andere Distributionen müssen Sie das Skript entsprechend anpassen.

Prinzip dieses Länderblockierschutzes :
Die IP-Bereiche im CIDR-Format werden von der Website http://www.ipdeny.com/ipblocks/data/countries/ abgeholt und in die einzelnen Listen des IPSets eingetragen, die nach Ländercodes benannt und dann referenziert werden von iptables, um das TARGET zu definieren (was mit den übereinstimmenden IPs zu tun ist:DROP )
HINWEIS: In diesem Beispiel setzt das Skript das iptables-Regelziel auf DROP statt ABLEHNEN um einen hohen Datenverkehr von TCP/IP-Stack-Ablehnungsantworten zu vermeiden. FALLEN antwortet nicht.

WICHTIGER HINWEIS: Dieses Skript unten sollte NACH ausgeführt werden Sie haben Ihre regulären Firewall-Regeln geladen. Es EINFÜGT die neuen iptables-Regeln so, dass alle eingehenden Pakete aus diesen definierten Ländern VORHER blockiert werden jede weitere Verarbeitung in Ihrer Firewall.

Schritte:
#!/bin/bash
# Description: Uses IPSET and IPTABLES to block full countries from accessing the server for all ports and protocols
# Syntax: countries_firewall.sh countrycode [countrycode] ......
# Use the standard locale country codes to get the proper IP list. eg.
# countries_firewall.sh cn ru ro
# Will create tables that block all requests from China, Russia and Romania
# Changes: 13.11.2016 Initial creation of script
# Note: To get a sorted list of the inserted IPSet IPs for example China list(cn) run the command:
# ipset list cn | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
# #############################################################################
# Defining some defaults
iptables="/sbin/iptables"
tempdir="/tmp"
sourceURL="http://www.ipdeny.com/ipblocks/data/countries/"
#
# Verifying that the program 'ipset' is installed
if ! (dpkg -l | grep '^ii ipset' &>/dev/null) ; then
echo "ERROR: 'ipset' package is not installed and required."
echo "Please install it with the command 'apt-get install ipset' and start this script again"
exit 1
fi
[ -e /sbin/ipset ] && ipset="/sbin/ipset" || ipset="/usr/sbin/ipset"
#
# Verifying the number of arguments
if [ $# -lt 1 ]; then
echo "ERROR: wrong number of arguments. Must be at least one."
echo "countries_firewall.sh countrycode [countrycode] ......"
echo "Use the standard locale country codes to get the proper IP list. eg."
echo "countries_firewall.sh cn ru ro"
exit 2
fi
#
# Now load the rules for blocking each given countries and insert them into IPSet tables
for country ; do
# Read each line of the list and create the IPSet rules
# Making sure only the valid country codes and lists are loaded
if wget -q -P $tempdir ${sourceURL}${country}.zone ; then
# Destroy the IPSet list if it exists
$ipset flush $country &>/dev/null
# Create the IPSet list name
echo "Creating and filling the IPSet country list: $country"
$ipset create $country hash:net &>/dev/null
(for IP in $(cat $tempdir/${country}.zone) ; do
# Create the IPSet rule from each IP in the list
echo -n "$ipset add $country $IP --exist - "
$ipset add $country $IP -exist && echo "OK" || echo "FAILED"
done) > $tempdir/IPSet-rules.${country}.txt
# Destroy the already existing rule if it exists and insert the new one
$iptables -D INPUT -p tcp -m set --match-set $country src -j DROP &>/dev/null
$iptables -I INPUT -p tcp -m set --match-set $country src -j DROP
# Delete the temporary downloaded counties IP lists
rm $tempdir/${country}.zone
else
echo "Argument $country is invalid or not available as country IP list. Skipping"
fi
done
# Display the result of the iptables rules in INPUT chain
echo "======================================"
echo "IPSet lists registered in iptables:"
$iptables -L INPUT -n -v | grep 'match-set'
# Dispaly the number of IP ranges entered in the IPset lists
echo "--------------------------------------"
for country ; do
echo "Number of ip ranges entered in IPset list '$country' : $($ipset list $country | wc -l)"
done
echo "======================================"
#
#eof

Loggin der Skriptoperation:

Wie Sie im Skript sehen können, wird das Hinzufügen von IP-Bereichen in den IPSet-Tabellen protokolliert:$tempdir/IPSet-rules.${country}.txt, die jedes Mal überschrieben wird, wenn das Skript für dasselbe Land ausgeführt wird.

Das Skript starten

Um sicherzustellen, dass dieses Firewall-Add-On bei jedem Booten ordnungsgemäß startet, aber nach der benutzerdefinierten Firewall, starte ich es über cron @reboot Job nach einer Verzögerung von ca. 40 Sek. (die an Ihre Bedürfnisse angepasst werden kann), um andere Dienste starten zu lassen, einschließlich des Firewall-Dienstes. Ich bin mir bewusst, dass diese Methode zum Starten des Skripts nicht sehr elegant ist, aber sie passt zu so ziemlich allen Variationen von Linux-Distributionen, ob Sysinit-V oder Systemd-basiert. Beispiel für einen Root-Cron-Job:
@reboot /bin/sleep 40 ; /bin/bash -c ". /root/.bashrc ; /root/bin/countries_firewall.sh cn ru"

Zugriffsberichte per E-Mail senden

Um jeden Tag Verkehrsberichte per E-Mail zu versenden, sammle ich jeden Tag die Verkehrsdaten von iptables, formatiere sie und sende sie per E-Mail mit dem folgenden Bash-Skript. Dieses Skript wird dann jeden Tag von cron ausgeführt (in /etc/cron.daily/ eingefügt) und der Verkehrszähler wird zurückgesetzt.
#!/bin/bash
# Purpose: Sends the blocked traffic report per email and resets the counter
# Syntax: iptables_report
# Dependencies: Systems tools: iptables, awk, column, whois, sendmail
# Changes: 13.11.2016 First implementation of script
#----------------------------------------------------------
HOST=$(cat /etc/hostname | tr 'a-z' 'A-Z')
email="[email protected]"
reportsender="cron@$HOST"
subject="BLOCKED Packets report on $(hostname | tr 'a-z' 'A-Z')"
tempdir="/tmp"
file1="iptables_report1.txt"
file2="iptables_report2.txt"
#
#------------ Build the header of the mail to send ------------
echo "From: $reportsender" > $tempdir/$file1
echo "To: $email" >> $tempdir/$file1
echo "Subject: $subject" >> $tempdir/$file1
echo "MIME-Version: 1.0" >> $tempdir/$file1
echo 'Content-Type: text/html; charset="ISO-8859-15"' >> $tempdir/$file1
echo "" >> $tempdir/$file1
echo "<br />" >> $tempdir/$file1
echo -e "<font size=3 FACE='Courier'><pre>" >> $tempdir/$file1
# Formatted message starts here
# Add the country at the end of each line
# Load the header and data to the temporary file 2
echo -e "Packets Bytes Source \n======= ========= ======" >$tempdir/$file2
/sbin/iptables -L -n -v | /bin/grep -v '^ 0' | /bin/grep 'match-set' | /usr/bin/awk '{print $1" "$2" "$11}' >> $tempdir/$file2
#
# Format temp file2 into temp file1
cat $tempdir/$file2 | column -t >> $tempdir/$file1
#
#
# Add the last HTML preformatting End
echo -e "</pre>" >> $tempdir/$file1
echo "" >> $tempdir/$file1
#
#----------------- Send the prepared email ---------------------------
# now format the report and send it by email
cat $tempdir/$file1 | /usr/sbin/sendmail -t
rm $tempdir/$file1 $tempdir/$file2
#
# Reset the iptables counters
/sbin/iptables -Z
#
# eof

Cronjob für regelmäßige Tagesberichte erstellen
Speichern Sie diese Datei in zB. /etc/cron.daily/iptables_report
Ausführbar machen:
chmod 755 /etc/cron.daily/iptables_report
Beispiel für eine Berichts-E-Mail:
Packets Bytes Source
======= ========= ======
188 7852 ru
19295 1150K cn

Manueller Status:
Um den manuellen Status der iptables-Regeln für die INPUT-Kette zu erhalten, führen Sie den folgenden Befehl aus:
iptables -L INPUT -v -n
Um eine sortierte Auflistung einer IPSet-IP-Liste zu erhalten, führen Sie den folgenden Befehl aus (z. B. für Russland):
ipset list ru | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4


Linux
  1. Alle Texte von Großbuchstaben in Kleinbuchstaben und umgekehrt umwandeln?

  2. Blockieren Sie den IP-Bereich von Ländern mit GeoIP und iptables

  3. IPTables Flush:Alle Regeln auf RedHat und CentOS Linux löschen/entfernen

  4. So installieren Sie MongoDB von der Quelle (und mit YUM) unter Linux

  5. So lassen Sie den gesamten Datenverkehr von einem Server mit Firewalld in CentOS/RHEL zu

So konvertieren Sie mit Alien von RPM zu DEB und DEB zu RPM-Paket

Alles über Tar-Dateien und wie man Dateien in Linux mit Terminal tart und enttarnt

Entfernen Sie alle Sonderzeichen und Groß-/Kleinschreibung aus der Zeichenfolge in Bash

Kopieren Sie alle Dateien, die dem Muster entsprechen, aus Verzeichnis und Unterverzeichnissen in ein einzelnes Verzeichnis

alle Zahlen von du summieren

Wie blockiert man mit Linux IPTables Torrents oder P2P-Protokolle?