GNU/Linux >> Znalost Linux >  >> Linux

Blokování veškerého provozu z jednotlivých zemí pomocí IPSet a IPTables

Úvod:
Když jsem se díval na syslog, příliš často jsem zjistil, že útoky na přihlášení SSH přicházejí buď z Číny, nebo z Ruska. Mám toho dost a každopádně neočekávám žádný provoz z žádné z těchto zemí, i když používám fail2ban přesto jsem se rozhodl zablokovat veškerý provoz přicházející z těchto 2 zemí. Fail2ban je skvělý nástroj pro blokování neúspěšných pokusů o přihlášení. ALE zdá se, že stále prochází mnoho pokusů (tisíce) za den. Mohu pouze předpokládat, že útočník používá paralelní odesílání pokusů a dokud Fail2ban (na základě auth logů) nezareaguje, mnoho jich prošlo.
Abychom provedli úplné blokování IP adres s předem načtenými seznamy rozsahů IP, začal jsem pomocí iptables s jedním pravidlem na rozsah IP, ALE načítání pravidel trvalo příliš dlouho a co je důležitější, načtení všech rozsahů IP, jako čistých pravidel iptables, způsobilo nestabilitu mého serveru, což znamená ... zhroutil se!!! Říká se, že více než max. 25 000 pravidel v iptables, zvláště větších než 27 000, může uvést jádro do nestabilního stavu.
K nápravě používám ipset s iptables . ipset je speciálně navržen tak, aby se vypořádal s velkými seznamy IP rozsahů (rychlé přístupové hašovací tabulky), které mohou obsahovat až 65536 položek.

POZNÁMKA: Níže uvedený skript je platný pouze pro distribuce Linuxu založené na Debianu. Pro ostatní distribuce budete muset skript odpovídajícím způsobem upravit.

Princip ochrany blokování těchto zemí :
Rozsahy IP ve formátu CIDR jsou získávány z webové stránky http://www.ipdeny.com/ipblocks/data/countries/ a zadávány do individuálních seznamů IPSet, které jsou pojmenovány podle kódů zemí a pak jsou odkazovány pomocí iptables definovat TARGET (co dělat se shodnými IP adresami:DROP )
POZNÁMKA: V tomto příkladu skript nastaví cíl pravidel iptables na DROP místo ODMIETNIT aby se zabránilo vysokému provozu odpovědí na odmítnutí zásobníku TCP/IP. DROP nic nereaguje.

DŮLEŽITÁ POZNÁMKA: Tento skript níže by měl být spuštěn PO načetli jste běžná pravidla brány firewall. VLOŽENÍ nová pravidla iptables tak, že všechny příchozí pakety z těchto definovaných zemí budou zablokovány PŘED jakékoli další zpracování ve vašem firewallu.

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

Přihlášení operace skriptu:

Jak můžete vidět ve skriptu, přidávání rozsahů IP v tabulkách IPSet je přihlášeno:$tempdir/IPSet-rules.${country}.txt, který je přepsán pokaždé, když je skript spuštěn pro stejnou zemi.

Spuštění skriptu

Abych se ujistil, že se tento doplněk firewallu spustí správně při každém spuštění, ale po uživatelem definovaném firewallu jej spustím pomocí cron @reboot úlohu po prodlevě asi 40 sekund (kterou lze upravit podle vašich potřeb), aby se spustily další služby, včetně služby firewall. Uvědomuji si, že tento způsob spuštění skriptu není příliš elegantní, ale hodí se téměř pro všechny varianty distribucí Linuxu, ať už založené na Sysinit-V nebo Systemd. Příklad úlohy root cronu:
@reboot /bin/sleep 40 ; /bin/bash -c ". /root/.bashrc ; /root/bin/countries_firewall.sh cn ru"

Zasílání zpráv o provozu e-mailem

Abych mohl každý den posílat zprávy o provozu e-mailem, sbírám každý den data o provozu z iptables, formátuji je a posílám e-mailem pomocí následujícího bash skriptu. Tento skript pak bude každý den spouštět cron (vloží se do /etc/cron.daily/) a počítadlo provozu se vynuluje.
#!/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

Vytvoření úlohy cron pro pravidelné denní zprávy
Uložte tento soubor např. /etc/cron.daily/iptables_report
Zajistěte, aby bylo možné jej spustit:
chmod 755 /etc/cron.daily/iptables_report
Příklad e-mailu s přehledem:
Packets Bytes Source
======= ========= ======
188 7852 ru
19295 1150K cn

Ruční stav:
Chcete-li získat ruční stav pravidel iptables pro řetězec INPUT, spusťte příkaz:
iptables -L INPUT -v -n
Chcete-li získat seřazený seznam seznamu IP IPSet, spusťte příkaz (např. pro Rusko):
ipset list ru | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4


Linux
  1. Blokování černé listiny hostitelů a iptables

  2. Blokovat rozsah IP ze zemí s GeoIP a iptables

  3. Jak monitorovat a protokolovat síťový provoz v systému Linux pomocí vnStat

  1. Pomocí awk vytisknete všechny sloupce od n-tého po poslední

  2. Zkopírujte všechny soubory odpovídající vzoru z adresáře a podadresářů do jednoho adresáře

  3. sečíst všechna čísla z du

  1. Jak vypisovat, nahrávat a stahovat soubory ze serveru SFTP pomocí golang

  2. Převést veškerý text z velkých na malá písmena a naopak?

  3. Jak blokovat torrenty nebo jakékoli P2P protokoly pomocí Linux IPTables?