Quase, mas não exatamente lá. As regras criadas primeiro rejeitarão as conexões acima de 50 de x.1
e x.2
e, em seguida, rejeitarão todas as conexões acima de 5 de qualquer lugar, incluindo x.1
e x.2
. Você precisa ter uma regra ACCEPT
para essas duas fontes antes do limitador comum.
Pode ser mais fácil inverter a correspondência no connlimit
:
-A INPUT -p tcp -s x.x.x.1 --syn -m connlimit --connlimit-upto 50 -j ACCEPT
-A INPUT -p tcp -s x.x.x.2 --syn -m connlimit --connlimit-upto 50 -j ACCEPT
-A INPUT -p tcp --syn -m connlimit --connlimit-upto 5 -j ACCEPT
-A INPUT -p tcp --syn -j REJECT
Você pode querer colocar essas regras em uma cadeia própria para não precisar repetir as partes comuns ( -p tcp --syn
) e, com uma cadeia separada, também é possível substituir ACCEPT
por RETURN
se você quer fazer outra filtragem depois dessas regras. A regra de aceitação precisaria aparecer em outro lugar, então.
O padrão para connlimit
é trabalhar por endereço de origem, por isso deve ser o que você deseja. Embora note que iptables
não tem nenhum conceito de "login", então se você realmente quiser limitar os logins em um nível de aplicativo, você precisará fazer isso lá.
Para evitar ficar bloqueado, convém ter certeza de que você tem uma regra separada primeiro para permitir o acesso administrativo de sua máquina (SSH talvez, pelo menos, conexões já estabelecidas). Outra possibilidade seria usar cron
ou at
para redefinir as regras do firewall para uma configuração válida após um momento, portanto, mesmo se você ficar bloqueado, não durará. Você só precisa se lembrar de remover essa proteção quando terminar.