Por ejemplo:
ufw deny 22 ufw allow 22 ufw deny from 220.60.90.55 to any por 22
Así de sencillo es bloquear un puerto, una ip, etc ...
El siguiente paso es añadir reglas a nuestro firewall, para esto recomiendo el programa fail2ban que monitoriza los ficheros de logs en busca de ataques y añadirá las "malas" IPs a la lista de baneados de nuestro firewall, pudiendo programar la duración del "castigo" para que les saque el baneo después de un tiempo prudencial.
Hasta aquí es una instalación típica (ufw + fail2ban) que podéis encontrar en cientos de tutoriales de internet.
Mi pequeña contribución es la siguiente.
En la pagina https://www.badips.com/get/list/ssh/1 podemos descargarnos una lista actualizada de IPs que han tenido un "mal comportamiento", así que podemos hacer un script que las añada a nuestro firewall:
curl https://www.badips.com/get/list/ssh/2 > blacklist.txt ufw status > status.txt ./badip status.txt blacklist.txt > add.sh sh add.sh
La primera linea descarga la lista actualizada de internet, luego guardamos una lista con las reglas que se aplican actualmente en el firewall, comprobamos que nuevas IPs hay en la lista y las añadimos. De la ultima parte, la de comprobar que IPs se han añadido y generar los comandos necesarios se encarga el siguiente programa en freepascal:
program badip; uses Sysutils, Classes; var Str: String; Blacklist: Text; begin if ParamCount <> 2 then Halt; with TStringList.Create do try Sorted:= TRUE; Duplicates:= dupIgnore; if FileExists(ParamStr(1)) then begin AssignFile(BlackList,ParamStr(1)); {$i-} Reset(BlackList); {$i+} if IOResult = 0 then try while not EOF(BlackList) do begin Readln(BlackList,Str); if Copy(Str,1,39) = 'Anywhere DENY ' then Add(Copy(Str,40,MAXINT)); end; finally CloseFile(BlackList); end; end; AssignFile(BlackList,ParamStr(2)); {$i-} Reset(Blacklist); {$i+} if IOResult = 0 then try while not EOF(BlackList) do begin Readln(BlackList,Str); if IndexOf(Str) < 0 then Writeln('ufw insert 1 deny from ' + Str); end; finally CloseFile(BlackList); end; finally Free; end; end.
En resumen tenemos el servidor fortificado usando ufw + fails2ban + badips
Solo tenemos que tener el cuidado de ejecutar el script peridicamente para mantener a los malos a raya.
Saludos