Bloqueando IP no Españolas en Linux
Hola amigos en esta ocasión quería enseñaros un script que hice hace tiempo para banear intentos de login en mi servidor de mail en plesk.
Por un lado uso una api externa para preguntar el pais de una determinada ip con https://ipapi.co/
Por otro lado tenemos que leer los logs del sistema donde buscaremos la cadena «authentication failure» los podemos encontrar en /var/log/messages o en /var/log/auth según lo que busquemos bloquear, ssh, mail, etc…
Con este comando filtraremos todas las ip con intentos fallidos:
cat /var/log/maillog |grep "authentication failure" | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' |sort -u > /root/ataques.log
Con el comando anterior tendremos un archivo llamado ataques.log donde estaran todas las ip que han fallado login.
Ahora no queremos bloquear a nuestros clientes, como todos son de España filtraremos por país con el siguiente ejemplo:
input="ataques.log"
while IFS= read -r line
do
echo "$line"
country=$(curl -s https://ipapi.co/$line/country/)
if [ "$country" = "ES" ]; then
echo "es España $country"
else
echo "NO España $country"
echo $line >> ips.txt
country=0
echo "Bloqueando ips"
fi
done < "$input"
El resultado de este while nos genera un archivo llamado ips.txt con direcciones ip de fuera de España, jjj ahora si que podemos bloquear a saco, pero antes formatearemos el archivo con el comando sed, despues pasaremos un listado de ip separadas por puntos a plesk para que se encargue de bloquear, aplicaremos y recargaremos firewall.
cat ips.txt | tr '\n' ' ' | sed 's/ /,/g' > drop.txt
ips=$(cat drop.txt)
/usr/local/psa/bin/modules/firewall/settings -s -name 'ataques_mail' -direction input -action deny -remote-addresses "$ips"
/usr/local/psa/bin/modules/firewall/settings -a
/usr/local/psa/bin/modules/firewall/settings -c
cat /dev/null > /root/ips.txt
cat /dev/null > /root/drop.txt
cat /dev/null > /root/ataques.log
Os dejo un link al repositorio
Saludos!!