Usando IPTables para bloquear portas para sub-redes de classe A enquanto permite portas da Web (80/443)

1

Trata-se de um servidor cPanel que, como a maioria dos servidores, está sob constante ataque de terras distantes. Considerando que só hospedo clientes nos EUA e no Canadá, há menos motivos para permitir acesso total à Ásia e à América do Sul, entre outras áreas.

Muitas regras de firewall podem aumentar a latência ou, pior ainda, travar o firewall. Ainda assim, devido à grande quantidade de ataques todos os dias, configurei o CSF para gerenciar no máximo 7000 regras. Alguns dias são mais leves que outros, mas no dia 1, 671 IPs foram bloqueados tentando acessar SMTP (669) e cPanel (2).

Para tentar obter um controle melhor, pensei em apenas permitir o acesso da Web a todos e impedir o acesso de grandes blocos específicos a FTP ou SMTP. Então, aqui está o que eu coloquei nas pré-regras do CSF [/usr/local/csf/bin/csfpre.sh].

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 21:25 -s 1.0.0.0/8 -j DROP
iptables -A INPUT -p tcp --dport 21:25 -s 2.0.0.0/8 -j DROP
iptables -A INPUT -p tcp --dport 21:25 -s 112.0.0.0/8 -j DROP
iptables -A INPUT -p tcp --dport 21:25 -s 113.0.0.0/8 -j DROP
iptables -A INPUT -p tcp --dport 21:25 -s 117.0.0.0/8 -j DROP
iptables -A INPUT -p tcp --dport 21:25 -s 190.0.0.0/8 -j DROP

Agora, eu não estou totalmente confiante em minhas habilidades de iptables, então eu gostaria de opiniões sobre isso e certamente feedback se isso está fazendo algo ruim.

Eu percebo que isso bloquearia uma enorme quantidade de emails em potencial e qualquer desenvolvedor da Web nessas áreas contratadas para trabalhar em sites hospedados no servidor. Meu pensamento é que é muito menos provável que qualquer email válido venha desses intervalos de IP. Além disso, escolhi blocos com base em minhas contagens de ataques.

Em vez de carregar os blocos IP reais de 6000 a 7000 para a Rússia, por exemplo, posso reduzir drasticamente as regras de firewall e mantê-las simples, concentrando-me apenas no bloqueio total de bloqueios de Classe A.

Eu usei este site para examinar exatamente quais países seriam bloqueados: tcpiputils.com

    
por Exit 24.07.2015 / 23:34

2 respostas

0

Tudo bem, eu não recebi nenhuma resposta boa e foi preciso tentativa e erro, além de monitoramento para determinar o que funciona para isso.

Eu descobri que algumas coisas eram necessárias, então o exemplo acima pode não funcionar em todos os sistemas porque um caminho completo deve ser usado nos executáveis. Além disso, ao especificar um intervalo de portas, você precisa adicionar em --match multiport caso contrário, ele irá ignorar completamente a regra. Por último, eu adicionei em um shebang no topo para garantir que o script será executado corretamente pelo shell.

Então aqui está a versão final:

/usr/local/csf/bin/csfpre.sh

#!/bin/sh
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -p all -s 60.168.112.0/20 -j DROP
/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26 -s 1.0.0.0/8 -j DROP
/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26 -s 112.0.0.0/7 -j DROP
/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26 -s 116.96.0.0/12 -j DROP
/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26 -s 116.118.0.0/16 -j DROP
/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26,110,465,587,995 -s 117.0.0.0/8 -j DROP

Agora, para o detalhamento do que está acontecendo neste servidor cPanel com o CSF instalado para um firewall.

  1. O CSF permite adicionar regras personalizadas que são executadas em grupos separados. Todos os grupos são executados pelo iptables. Primeiro, csfpre.sh, depois CSF, depois csfpost.sh.

  2. Crie um arquivo csfpre.sh se ele não existir. Você pode colocar isso na pasta / etc / em algum lugar também, mas sempre terá a versão em / usr / local / csf / bin / com prioridade.

  3. Adicione a shebang no topo:

    ! / bin / sh

  4. Meu plano é fazer algum bloqueio de porta via csfpre.sh, mas em vez de executar todas as regras, primeiro ele detecta se a conexão é para uma visita à página da web. Ao verificar isso primeiro, reduz o tempo de latência / resposta.

As portas 80 e 443 são para os protocolos HTTP e HTTPS, antes de mais nada, se a entrada for para qualquer uma dessas portas, ACCEPT e pare de verificar regras para este grupo csfpre:

/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  1. Agora, poderíamos bloquear totalmente todas as outras portas, exceto 80 e 443, se a próxima linha for assim:

    / sbin / iptables -A INPUT -p all -s 60.168.112.0/20 -j DROP

Como todo o tráfego da web já é aceito, isso não bloqueará o tráfego do website para esse intervalo. Se essa linha chegasse primeiro, bloquearia todo o tráfego, incluindo o tráfego da web. Não quero impedir que usuários bons visualizem sites bloqueando toda a sub-rede em que estão.

  1. Se o bloqueio for reduzido a portas específicas, poderemos bloquear uma porta específica, um intervalo, uma lista ou uma combinação desses.

Para bloquear apenas o FTP:

/sbin/iptables -A INPUT -p tcp --dport 21 -s 1.0.0.0/8 -j DROP

O FTP na verdade usa algumas portas diferentes para estabelecer uma conexão, e também há SFTP / SSH que normalmente é a porta 22, então é melhor bloquear um intervalo usando a porta inicial separada por dois pontos e depois a porta final:

/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26 -s 1.0.0.0/8 -j DROP

Você deve usar o multiport --match se você estiver usando um intervalo ou uma lista. As listas não podem ter mais de 15 portas, e cada porta em um intervalo conta contra o total de 15 portas.

Você também pode bloquear as portas de e-mail SMTP padrão:

/sbin/iptables -A INPUT -p tcp --match multiport --dport 110,465,587,995 -s 117.0.0.0/8 -j DROP

E, de fato, você pode usar intervalos em sua lista para bloquear as portas de FTP e de e-mail em uma regra:

/sbin/iptables -A INPUT -p tcp --match multiport --dport 21:26,110,465,587,995 -s 117.0.0.0/8 -j DROP
  1. Salve seu script e reinicie o firewall.

  2. Permita que o CSF e o cpHulk bloqueiem endereços IP individuais conforme necessário.

Você pode usar seu smartphone sem usar sua conexão local para testar. Obtenha o endereço IP do seu telefone e verifique se ele não é o mesmo que o computador do qual você trabalhará. Você pode então percorrer todos os cenários, supondo que você tenha o telefone configurado para verificar ou enviar e-mail através do seu servidor e um programa de FTP também.

Para o bloqueio, decidi impedir que sub-redes inteiras acessem o FTP e, para algumas, o SMTP. Para reduzi-lo, analisei todos os alertas recebidos e comparei as piores sub-redes com os países listados neste site: link

O objetivo final é reduzir o número de IPs individuais bloqueados pelo CSF. Bloquear milhares de IPs pode causar um problema de latência, portanto, ter algumas regras padrão para bloquear países repletos de usuários mal-intencionados reduz a necessidade de gerenciar um número tão grande de IPs individuais.

Para recalcular intervalos de sub-rede válidos, use esta ferramenta: link

112.0.0.0/7 expande 112.0.0.0 para 113.255.255.255 , mas 111.0.0.0/7 é um bloqueio inválido, portanto, seria 110.0.0.0 para 111.255.255.255 . É importante que você verifique seus intervalos de sub-rede para que você não acabe bloqueando os IPs errados.

    
por 01.09.2015 / 15:06
0

Isso pode ser melhor tratado pelo software de spam? 670 hosts por dia não é um grande número de hosts. Nesse tamanho, você também pode considerar apenas hosts limitadores de taxa, para permitir a todos, mas se alguém se conecta repetidamente e tenta enviar spam, você os bloqueia. Isso pode ser feito por meio do rastreamento de conexão. Lembre-se, rastreamento de conexão pode dar errado se você tiver milhões de hosts contatando você, mas deve estar bem em 670 / dia. Isso significaria algo assim (não testado, desculpe):

iptables -A INPUT -p tcp --dport 21:25 -i eth0 -m conntrack --ctstate NEW -m recent  --update --seconds 300 --hitcount 20 -j DROP
iptables -A INPUT -p tcp --dport 21:25 -i eth0 -m conntrack --ctstate NEW -m recent --set

(Claro, você pode querer colocar na lista de permissões pessoas que lhe enviam toneladas de e-mail.)

    
por 25.07.2015 / 01:59