Solución 1:
Puede usar iptables para limitar la velocidad de las nuevas conexiones entrantes al puerto SSH. Tendría que ver toda la configuración de iptables para brindarle una solución llave en mano, pero básicamente está hablando de agregar reglas como:
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT
Estas reglas asumen que está aceptando conexiones ESTABLECIDAS anteriormente en la tabla (por lo que solo las conexiones nuevas cumplirán con estas reglas). Las nuevas conexiones SSH cumplirán estas reglas y se marcarán. En 60 segundos, 5 intentos desde una sola dirección IP darán como resultado que se eliminen nuevas conexiones entrantes desde esa IP.
Esto ha funcionado bien para mí.
Editar:prefiero este método a "fail2ban" porque no se debe instalar software adicional y ocurre totalmente en modo kernel. No maneja el análisis de archivos de registro como lo hará "fail2ban", pero si su problema es solo con SSH, no usaría algo en modo de usuario que requiera instalación de software y sea más complejo.
Solución 2:
fail2ban puede ayudar con esto bloqueando las direcciones IP con demasiados intentos fallidos de inicio de sesión.
Solución 3:
Recomendaría usar un puerto no estándar para SSH si puede (es decir, el puerto 10222), pero como mencionó que no puede hacer eso, recomendaría usar algo como DenyHosts.
http://denyhosts.sourceforge.net/
Gran paquete, fácil de instalar y configurar.
Solución 4:
Si bien puede ser bueno poder ingresar a su sistema desde ubicaciones arbitrarias en Internet, existen sistemas automatizados de ataque de contraseña que se bloquearán en un puerto ssh abierto y aplicarán varios ataques de diccionario y cuenta joe contra su sistema. Esto puede ser agravante para leer en su resumen de registro nocturno y es una pérdida de su ancho de banda.
Si tiene un servidor web en el mismo sistema, puede usar envoltorios php y tcp para restringir el tráfico entrante ssh a sistemas conocidos, además de proporcionarle una clave de puerta trasera para permitirle el acceso desde sistemas arbitrarios en Internet.
Así es como lo haces:
denegar todas las conexiones ssh en /etc/hosts.deny:
# /etc/hosts.deny fragment
sshd: all
Permitir sistemas conocidos por IP en /etc/hosts.allow, además de agregar un archivo para acceso temporal:
# /etc/hosts.allow fragment
sshd: 10.0.10.2 # some system
sshd: 172.99.99.99 # some other system
sshd: /etc/hosts.allow.temporary-sshd-access
Cree un archivo php en su servidor web y asígnele un nombre no obvio como my-sshd-access.php:
<?php
function get_ip()
{
return getenv("REMOTE_ADDR");
}
?>
<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';
print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);
$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);
print "Wrote: ";
readfile($out);
?>
Perdone el código php:lo deslicé desde otro lugar, por lo que probablemente podría soportar que se limpie un montón. Todo lo que hace es agregar la dirección IP del sistema que accede al archivo /etc/hosts.allow.temporary-sshd-access, que sshd lee (debido a su inclusión en /etc/hosts.allow) en el momento de la conexión. .
Ahora, cuando se encuentre en algún sistema arbitrario en la web y quiera conectarse a este sistema, primero use un navegador web y presione este archivo (o use wget o equivalente):
$ wget http://your.system.name/my-sshd-access.php
Ahora debería poder conectarse a su sistema. Si este es un lugar desde el que probablemente ingresará con frecuencia, sería trivial leer el contenido del archivo /etc/hosts.allow.temporary-sshd-access y agregar permanentemente la dirección IP a /etc/hosts. permitir.
Solución 5:
Es posible que también desee ver denyhosts.
FYI:OpenSSH 6.7 elimina la compatibilidad con tcpwrappers, lo que significa que denyhosts probablemente no sea la solución para nuevas instalaciones.