Quero confirmar o seguinte. Se eu criar uma cadeia cuja primeira regra seja:
iptables -I INPUT -p tcp -m multiport --dports 25,465 -j name
Isso significa que quaisquer outras regras especificadas na cadeia não são verificadas, a menos que o pacote seja proveniente dessas portas?
Estou usando fail2ban
e criei um filtro com uma regra de banimento que especifica a porta 25, 465, usando -m multiport --dports 25,465
. Mas esse filtro acabou criando um número grande de regras, que ocasionalmente o ksoftirqd
processo consumia muita CPU e a rede ficava lenta. Percebi que isso ocorria quando o servidor tinha muitas E/S ocorrendo em outras portas.
Presumo que cada pacote estava analisando todas as regras da minha cadeia. Espero poder evitar isso adicionando a primeira regra vista acima, para que os pacotes que não vão para as portas 25 e 465 não se preocupem em verificar o restante das regras nessa cadeia. Se isso não acontecer, eu apreciaria conhecer qualquer outra solução possível.
Responder1
Não “de”, mas “para”. --dports
listasdestinoportos. A regra como você escreveu significa: "se o pacote foi enviado para o meu serviço escutando na porta TCP 25 ou 465, processe-o na cadeia name
". A forma como será processado depende do conteúdo dessa cadeia. Se não corresponder a nenhumação final( ACCEPT
, REJECT
, DROP
) nessa cadeia, ou se combinar uma regra com a RETURN
ação, seu processamento continuará na cadeia de chamada ( INPUT
) com a regra seguinte a esta.
Por padrão, fail2ban
cria uma cadeia e uma regra que invoca a cadeia apenas para pacotes destinados a determinada porta (a menos que você esteja usando ...-allports
ação, o que não é o padrão). Nessa cadeia adiciona uma regra DROP para cada IP banido. Assim, por exemplo, os pacotes do servidor web não serão enviados para processamento na cadeia criada para a sshd
jail fornecida. Portanto, "excluir" deliberadamente certas portas do processamento do fail2ban da maneira que você sugere não é produtivo; já funciona assim.
Para evitar a criação de cadeias com muitas regras com fail2ban, investigueipset-ações relacionadas. Em vez de criar uma cadeia, f2b-jailname
cria-se umaConjunto de IPe uma única regra que corresponde ao ipset. Cada IP banido é adicionado ao ipset, em vez de criar uma regra separada na cadeia. O ipset possui característica de complexidade O(1), o que significa que sua velocidade de processamento não depende do número de itens nele contidos; ele pode conter até 65.536 itens.
Para usar isso, em resumo, você precisa substituir o padrão banaction = iptables
por banaction = iptables-ipset
suas prisões. Você nunca deve modificar os arquivos de configuração fornecidos pela distribuição; em vez disso, crie /etc/fail2ban/jail.local
um arquivo onde você adiciona suas substituições:
[postfix]
bantime = 1h
enabled = true
banaction = iptables-ipset
(Isso usará o postfix
filtro de e-mail fornecido e reagirá a todos smtpd
os tipos de serviços. Se você usar outro servidor de e-mail, ajuste de acordo.)
Outra maneira de obter melhor eficiência do firewall é começar a usarnftables
estrutura em vez de iptables
. Possui recursos de conjuntos de IPintegrado, e você pode usá-lo com fail2ban usando o banaction = nftables
. O ganho de eficiência para conjuntos grandes será aproximadamente o mesmo.