A extensão limit
implementa um mecanismo de token bucket. Geralmente, quando uma regra corresponde, o netfilter salta para o destino fornecido, ACCEPT
neste caso. Quando você conecta a extensão limit
, o netfilter tem que remover um "token" do "balde" desta regra antes que seja permitido pular. Se não houver tokens no bucket, essa extensão impedirá que o netfilter salte, mesmo que a regra tenha correspondido.
--limit 50/minute #tells netfilter to add 50 tokens per minute to the bucket
--limit-burst 200 #tells netfilter to use a bucket which holds up to 200 tokens
Se houver 50 solicitações de conexão por minuto (ou mais), seu servidor permitirá 50 novas conexões a cada minuto. Se houver menos de 50 solicitações em um minuto, o depósito será preenchido (na verdade, ele começará cheio). Isso significa que, se houver apenas algumas solicitações em um minuto, o servidor aceitará mais de 50 novas solicitações no próximo minuto. Para evitar que isso saia do controle, há um limite para o número de fichas que o recipiente pode conter. 200 neste caso. Quando o bucket estiver cheio, seu servidor aceitará as próximas 200 conexões recebidas, mesmo quando elas atingirem seu servidor ao mesmo tempo. Como isso é mais do que 50, chamamos isso de burst, onde o número de conexões aceitas chega a mais do que as 50 que queremos ON AVAERAGE .
A segunda regra significa que esta máquina aceitará 50 pacotes IP em segundo sem mais investigação, contanto que eles pertençam a um fluxo que o netfilter reconhece. Para avaliar os efeitos dessa regra, precisaríamos ver toda a cadeia (e cada cadeia que faz referência e é referenciada por). No entanto, posso lhe dizer algumas coisas que se alinham aqui:
-
O Netfilter conta o ACK do iniciador da conexão TCP para concluir o handshake como um pacote
RELATED
. 50 conexões estabelecidas com sucesso por minuto saturam perfeitamente a segunda regra com a qual você está tendo problemas. -
As implementações TCP mais comuns fazem quatro tentativas de conexão antes de desistir. Com 50 conexões estabelecidas com sucesso, você recebe 200 solicitações de conexão, no pior dos casos.
-
Não importa com que frequência um endpoint faça uma solicitação de conexão específica, apenas um precisa ser bem-sucedido, dentro de um período de tempo razoável, para estabelecer a conexão. A maioria das implementações coloca 60 segundos como a quantidade de tempo razoável padrão.
Se a última regra fosse 50/minute
, essas quatro regras poderiam ser parte de uma estrutura de proteção do DoS realmente interessante. Como ele não tem o filtro --dport 80
e é 50/second
, só posso adivinhar:
a) Você arrancou totalmente esta linha do contexto e ela não está imediatamente relacionada aos três primeiros.
b) Esse é um limite geral para diminuir o tráfego.
c) É um erro e deve ser 50/minute
.
d) É uma troca entre proteger o servidor contra ataques DoS e manter o serviço acessível durante e imediatamente após um ataque DoS.
Para entender o segundo recorte, primeiro você deve detalhar que a extensão recent
usa e mantém o conhecimento sobre o endereço IP de origem.
A extensão recent
gerencia seu conhecimento em listas. A lista padrão é denominada DEFAULT
e é usada se nenhuma outra lista for fornecida. Um fornece outra lista usando --name
.
Portanto, as duas primeiras regras significam "descartar este pacote se o IP de origem tiver sido colocado na lista portscan
nos últimos 86400 segundos".
As segundas duas regras significam "remova este endereço IP da lista portscan
". Por favor, não que esta regra seja avaliada apenas se a regra anterior não corresponder. Esta regra existe para manter a lista portscan
curta. Listas mais longas levam mais tempo para pesquisar.
As últimas quatro regras colocam os IPs de origem na lista portscan
, registram sobre isso e DROP
o pacote. --dport 139
está lá porque esse comportamento é desejado apenas neste caso. Tenho certeza de que essas regras fazem muito mais sentido quando no contexto, porque isso não é um conjunto completo de regras para impedir a varredura de portas.