Você está quase lá, mas é possível que você tenha sido responsável pelo trabalho de outra pessoa, possivelmente no limite de taxa ssh, sem realmente entender. Por favor, note que não estou criticando você: construir o trabalho de outras pessoas é uma excelente ideia na comunidade de software livre; mas você deve entender por que eles fizeram o que fizeram, então você não deixa de usá-lo corretamente.
Eu configurei um equipamento de teste, usando nc
(netcat) para inundar o tráfego UDP de uma máquina chamada bill para uma máquina chamada risby com as seguintes linhas:
risby% nc -l -u 12345
bill% seq 1 10000000 | nc -u risby 12345
Isso produziu uma lista de números muito rapidamente crescente a partir do netcat do risby, muito parecido com a inundação de comandos que você está tendo.
Mas quando criei duas novas regras para o iptables de risby que filtravam apenas o tráfego UDP para a porta 12345 sem considerar o estado , funcionou bem:
iptables -I INPUT 1 -p udp --dport 12345 -m recent --set --name ddos
iptables -I INPUT 2 -p udp --dport 12345 -m recent --rcheck --seconds 1 --hitcount 5 --name ddos -j DROP
Quando eu corri novamente os netcats, os primeiros pacotes da conta passaram pelo risby, e os números subiram rapidamente para cerca de 1800, mas depois pararam completamente e nenhum tráfego adicional foi recebido da conta.
Note que é muito importante que estas regras venham cedo na sua cadeia INPUT do iptables, e é por isso que as insiro nas linhas 1 e 2, respectivamente.
Editar :
Aumente a taxa e exija que ela seja mantida por mais tempo; talvez --seconds 10 --hitcount 50
? Eventualmente, você atingirá um limite em que poucos clientes legítimos são afetados, mas o DDoS ainda é substancialmente limitado. Note que o fogo amigo é sempre uma possibilidade neste tipo de afogamento de camada 3; meu próprio servidor ssh limita novas conexões a duas por 60s, o que torna as scps repetidas bastante lentas. Mas é um preço que eu estou disposto a pagar e, para fazer melhor, é necessário o afogamento da camada 4, o que significa que o aplicativo precisa estar ciente do afogamento. iptables não pode ajudá-lo lá.
Observo que --hitcount
não pode receber nenhum valor maior que o parâmetro ip_pkt_list_tot
do módulo do kernel xt_recent e, se o valor for excedido, um erro será lançado no momento da criação da regra:
[root@risby scratch]# iptables -A INPUT -p udp -m recent --rcheck --seconds 1 --hitcount 50 --name ddos -j DROP
iptables: Invalid argument. Run 'dmesg' for more information.
Mas esse valor pode ser definido em até 255 no momento da inserção do módulo. Seguindo as sugestões nesta entrada de blog , é possível recarregar o módulo , definindo o parâmetro explicitamente:
[root@risby scratch]# rmmod xt_recent
[root@risby scratch]# modprobe xt_recent ip_pkt_list_tot=100
[root@risby scratch]# iptables -A INPUT -p udp -m recent --rcheck --seconds 1 --hitcount 50 --name ddos -j DROP
[root@risby scratch]#
Observe como o --hitcount 50
não causa mais erros. Talvez você precise liberar a INPUT
chain ( iptables -F INPUT
) e quaisquer outras cadeias que usam o módulo recent
antes de poder remover e reinserir o módulo xt_recent
.