#!/bin/bash
_urlIList='
https://lists.blocklist.de/lists/strongips.txt
https://api.blocklist.de/getlast.php?time=24h
https://check.torproject.org/torbulkexitlist
';
### Nicht mehr benutzen (Skript-Kiddy ohne Kontaktmöglichkeit, listet auch private IP-Adressen)
# https://bl.isx.fr/raw
### Programm:
fwlist() {
/usr/sbin/iptables -nL | grep 'DROP' | sed -E 's/ +/ /g' | cut -d ' ' -f4 | sort -V;
}
umask 177
rulesFile=$(mktemp);
listFile=$(mktemp);
# Holen der bösen IPs
zeilen=0;
for url in ${_urlIList}; do
echo "Aktion: Hole ${url}";
wget --no-check-certificate -q -O- "${url}" >> $listFile;
zeilen=$(($(wc -l < $listFile)-zeilen));
echo "${zeilen} Zeilen von ${url} geholt.";
if [ 0 -lt $? ]; then
echo "Fehler: Download von $url hat nicht funktioniert";
fi
done
# Test auf Daten, ggf. Abbruch:
if [ 0 -eq $(wc -l < $listFile) ]; then
echo "Es konnten keine Daten empfangen werden";
less $listFile;
exit 2;
fi
# Ausfiltern und Liste in Variable laden
# Generator für Liste privater Netzwerke (für grep):
#PrivateIPs='^127|^10\.|^192\.168|^169.254';
#for i in $(seq 1 31); do
# PrivateIPs="${PrivateIPs}|^172\.$i\.";
#done
PrivateIPs='^127|^10\.|^192\.168|^169.254|^172\.1\.|^172\.2\.|^172\.3\.|^172\.4\.|^172\.5\.|^172\.6\.|^172\.7\.|^172\.8\.|^172\.9\.|^172\.10\.|^172\.11\.|^172\.12\.|^172\.13\.|^172\.14\.|^172\.15\.|^172\.16\.|^172\.17\.|^172\.18\.|^172\.19\.|^172\.20\.|^172\.21\.|^172\.22\.|^172\.23\.|^172\.24\.|^172\.25\.|^172\.26\.|^172\.27\.|^172\.28\.|^172\.29\.|^172\.30\.|^172\.31\.';
ipList=$(grep -Pv -- "$PrivateIPs" "${listFile}" | sort -uV | grep -P -- '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | grep -Pv -- "^[ \t]*$" | tr "\n" ' ';);
#letztes Leerzeichen löschen:
ipList=${ipList:0:${#ipList}-1};
/usr/sbin/iptables-save | grep -v -- '^-A f2b.*DROP' > /etc/iptables.rules
echo -n "# Generated by $0 on " > $rulesFile;
date >> $rulesFile;
echo '*filter' >> $rulesFile;
grep ':INPUT ACCEPT \[' < /etc/iptables.rules >> $rulesFile;
grep ':FORWARD ACCEPT \[' < /etc/iptables.rules >> $rulesFile;
grep ':OUTPUT ACCEPT \[' < /etc/iptables.rules >> $rulesFile;
echo ':f2b-sshd - [0:0]' >> $rulesFile;
echo ':BLOCKLIST - [0:0]' >> $rulesFile;
echo '-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT' >> $rulesFile;
echo '-A INPUT -j BLOCKLIST' >> $rulesFile;
echo '-A FORWARD -j BLOCKLIST' >> $rulesFile;
echo '-A OUTPUT -j BLOCKLIST' >> $rulesFile;
grep '^-A INPUT -s' < /etc/iptables.rules >> $rulesFile;
# IPs an neue Chain anhängen
for ip in ${ipList}; do
echo "-A BLOCKLIST -s ${ip}/32 -j DROP" >> $rulesFile;
done
echo '-A f2b-sshd -j RETURN' >> $rulesFile;
echo 'COMMIT' >> $rulesFile;
echo -n '# Completed on ' >> $rulesFile;
date >> $rulesFile;
/usr/sbin/iptables-restore < $rulesFile;
if [ 0 = $? ]; then
/usr/sbin/iptables-save > /etc/iptables.rules;
rows=$(fwlist | wc -l);
echo "${rows} IPs sind jetzt blockiert.";
fi
rm -f $rulesFile
rm -f $listFile;