code.fastix.org

Dateiansicht:

Datei:Projekte -> Linux:block_bad_ips -> block_bad_ips.sh
md5:1ceea9c4015a5fbe53213f12d23b8672
sha1:c4aecd39dd660fa79da3f5fae5d3bf304960599d
Download-Link:Download
  1. #!/bin/bash
  2.  
  3. _urlIList='
  4. https://lists.blocklist.de/lists/strongips.txt
  5. https://api.blocklist.de/getlast.php?time=24h
  6. https://check.torproject.org/torbulkexitlist
  7. ';
  8.  
  9. ### Nicht mehr benutzen (Skript-Kiddy ohne Kontaktmöglichkeit, listet auch private IP-Adressen)
  10. # https://bl.isx.fr/raw
  11.  
  12. ### Programm:
  13.  
  14. fwlist() {
  15.         /usr/sbin/iptables -nL | grep 'DROP'  | sed -E 's/ +/ /g' | cut -d ' ' -f4 | sort -V;
  16. }
  17.  
  18. umask 177
  19. rulesFile=$(mktemp);
  20. listFile=$(mktemp);
  21.  
  22. # Holen der bösen IPs
  23. zeilen=0;
  24. for url in ${_urlIList}; do
  25.         echo "Aktion: Hole ${url}";
  26.         wget  --no-check-certificate -q -O- "${url}"  >> $listFile;
  27.         zeilen=$(($(wc -l < $listFile)-zeilen));
  28.         echo "${zeilen} Zeilen von  ${url} geholt.";
  29.         if [ 0 -lt $? ]; then
  30.                 echo "Fehler: Download von $url hat nicht funktioniert";
  31.     fi
  32. done
  33.  
  34. # Test auf Daten, ggf. Abbruch:
  35.  
  36. if [ 0 -eq $(wc -l < $listFile) ]; then
  37.         echo "Es konnten keine Daten empfangen werden";
  38.         less $listFile;
  39.         exit 2;
  40. fi
  41.  
  42. # Ausfiltern und Liste in Variable laden
  43.  
  44. # Generator für Liste privater Netzwerke (für grep):
  45. #PrivateIPs='^127|^10\.|^192\.168|^169.254';
  46. #for i in $(seq 1 31); do
  47. #       PrivateIPs="${PrivateIPs}|^172\.$i\.";
  48. #done
  49.  
  50. 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\.';
  51. 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" ' ';);
  52.  
  53. #letztes Leerzeichen löschen:
  54. ipList=${ipList:0:${#ipList}-1};
  55.  
  56. /usr/sbin/iptables-save | grep -v -- '^-A f2b.*DROP' > /etc/iptables.rules
  57.  
  58. echo -n "# Generated by $0 on " > $rulesFile;
  59. date >> $rulesFile;
  60. echo '*filter' >> $rulesFile;
  61. grep ':INPUT ACCEPT \[' < /etc/iptables.rules >> $rulesFile;
  62. grep ':FORWARD ACCEPT \[' < /etc/iptables.rules >> $rulesFile;
  63. grep ':OUTPUT ACCEPT \[' < /etc/iptables.rules >> $rulesFile;
  64. echo ':f2b-sshd - [0:0]' >> $rulesFile;
  65. echo ':BLOCKLIST - [0:0]' >> $rulesFile;
  66. echo '-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT'  >> $rulesFile;
  67. echo '-A INPUT -j BLOCKLIST' >> $rulesFile;
  68. echo '-A FORWARD -j BLOCKLIST' >> $rulesFile;
  69. echo '-A OUTPUT -j BLOCKLIST' >> $rulesFile;
  70. grep '^-A INPUT -s' < /etc/iptables.rules >> $rulesFile;
  71. # IPs an neue Chain anhängen
  72. for ip in ${ipList}; do
  73.         echo "-A BLOCKLIST -s ${ip}/32 -j DROP" >> $rulesFile;
  74. done
  75.  
  76. echo '-A f2b-sshd -j RETURN' >> $rulesFile;
  77. echo 'COMMIT'  >> $rulesFile;
  78. echo -n '# Completed on ' >> $rulesFile;
  79. date >> $rulesFile;
  80. /usr/sbin/iptables-restore < $rulesFile;
  81. if [ 0 = $? ]; then
  82.         /usr/sbin/iptables-save > /etc/iptables.rules;
  83.         rows=$(fwlist | wc -l);
  84.         echo "${rows} IPs sind jetzt blockiert.";
  85. fi
  86. rm -f $rulesFile
  87. rm -f $listFile;
  88.