O iptables possui um método para adicionar automaticamente endereços IP a uma lista se as condições definidas pelo usuário forem atendidas. Eu uso o seguinte para ajudar a evitar tentativas de invasão automatizadas na minha porta ssh:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP
Isso ajuda a limitar as tentativas automatizadas de obter acesso ao servidor, limitando as tentativas de conexão do mesmo endereço IP a uma a cada 60 segundos.
Se você quiser permitir um número definido de tentativas em um período de tempo, como 4 em 5 minutos, e em caso de falha, coloque-as na lista negra por um período mais longo, como 24 horas, por exemplo:
iptables -X black
iptables -N black
iptables -A black -m recent --set --name blacklist -j DROP
iptables -X ssh
iptables -N ssh
iptables -I ssh 1 -m recent --update --name blacklist --reap --seconds 86400 -j DROP
iptables -I ssh 2 -m recent --update --name timer --reap --seconds 600 --hitcount 4 -j black
iptables -I ssh 3 -m recent --set --name timer -j ACCEPT
iptables -A INPUT -p TCP --dport ssh -m state --state NEW -j ssh
Acima, criamos duas cadeias; "ssh" e "preto" e 2 listas; "temporizador" e "lista negra".
Resumidamente; a última corrente mostrada acima é a "entrada" na corrente ssh.
- A regra 1 na cadeia ssh verifica se o IP de origem está na lista "blacklist". Em caso afirmativo, a conexão é interrompida e o cronômetro da lista negra de 24 horas é reiniciado. Se a regra 1 é falsa, então vamos para a regra 2.
- A regra 2 na cadeia ssh verifica se o IP de origem fez mais de 4 tentativas de conexão em 5 minutos. Se assim for, ele envia o pacote para a cadeia "preto", onde é adicionado à lista "lista negra". A corrente "preta", em seguida, desativa a conexão e terminamos.
- A regra 3 da cadeia "ssh" só é alcançada se as regras 1 e 2 forem falsas. Em caso afirmativo, o pacote é ACEITO e o IP de origem é adicionado à lista "timer" para que possamos monitorar a frequência de tentativa de conexão.
A opção "--reap" diz ao kernel para procurar na lista e limpar quaisquer itens que sejam mais antigos que o limite de tempo definido; 5 minutos para a lista "temporizador" e 24 horas para a lista "lista negra".
nota: os espaços extras são para legibilidade e são opcionais no seu script de shell.