Skip to content

Instantly share code, notes, and snippets.

@exos
Created March 22, 2017 21:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save exos/ef828e75f3dfcc0f7284c9fc1e00e2c4 to your computer and use it in GitHub Desktop.
Save exos/ef828e75f3dfcc0f7284c9fc1e00e2c4 to your computer and use it in GitHub Desktop.
Reglas iptables para SSH anti brute force
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
## Vamos a definir dos names:
# TMPBLOCKED: Van a ser clientes temporalmente bloqueados
# BLOCKED: Van a ser cliente bloqueados a largo plazo
-N TMPBLOCKED
-N BLOCKED
-N SSH
## Definimos TMPBLOCKED, para bloqueos temporales
-A TMPBLOCKED -m recent --set --name tmpblocked
-A TMPBLOCKED -j DROP
## Antes de verificar mas, bloqueamos si es en "blocked"
# aparte, actualizamos el bloqueo a 24 horas desde el nuevo intento
-A INPUT -p tcp --syn -m recent --name blocked --update --seconds 86400 -j DROP
## Definimos BLOCKED
-A BLOCKED -m recent --name blocked --set
# Logueamos que una ip fue bloqueada a largo plazo
-A BLOCKED -m limit --limit 2/min -j LOG --log-prefix "IP blocked: " --log-level 7
# Dropeamos
-A BLOCKED -j DROP
## Definimos SSH para manejar las conecciones a este protocolo
-A SSH -p tcp --syn -m recent --name ssh --set
## Si hay 100 conexiones en las últimas 24 horas, bloqueamos a largo plazo
-A SSH -p tcp --syn -m recent --name ssh --rcheck --seconds 86400 --hitcount 100 -j BLOCKED
## Si hay 10 conexiones en los anteriores 30 minutos, bloqueamos temporalmente
-A SSH -p tcp --syn -m recent --name ssh --rcheck --seconds 1800 --hitcount 10 -j TMPBLOCKED
# Si hay mas de dos conexiones en los anteriores 5 segundos, o 4 en los anteriores 30 segundos
# dropeamos el paquete
-A SSH -p tcp --syn -m recent --name ssh --rcheck --seconds 5 --hitcount 2 -j DROP
-A SSH -p tcp --syn -m recent --name ssh --rcheck --seconds 30 --hitcount 4 -j DROP
# Si está todo bien, aceptamos la conexión
-A SSH -m recent --name ssh --set -j ACCEPT
## Si la conexión ya está establecida, los paquetes pasan libres
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
## Liberamos conexiones locales
-A INPUT -i lo -j ACCEPT
## En caso de neuva conexión al puerto 22 tcp, lo mandamos a SSH
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j SSH
COMMIT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment