Setup iptable com prevenção ab -n 100000 -c 1000

0

Eu gostaria de configurar regras básicas de firewall com o iptables. O objetivo é rejeitar as solicitações de inundação por IP. Como "ab -n 100000 -c 1000"

Existem apenas 2 regras:

iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m limit --limit 100/s --limit-burst 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j LOG --log-prefix "__test__"

Mas quando eu escrevo iptables no grep com "sort" e "uniq -c" eu vejo muitos IPs como:

1 SRC=173.252.77.112
1 SRC=173.252.114.116
1 SRC=173.252.114.114
1 SRC=173.252.114.113

É "-m state --state NEW" efetua apenas novas conexões? Então, por que os IPs com baixa contagem de solicitações apareceram no log?

Por favor, conselhos.

    
por Dmitry Belyaev 16.07.2015 / 10:09

2 respostas

1

Finalmente, a solução é:

iptables -A INPUT -i eth0 -p tcp --dport 80 -m hashlimit --hashlimit 1000/sec --hashlimit-burst 5000 --hashlimit-mode dstip --hashlimit-name hosts -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j REJECT

Não bloqueie pacotes de rastreadores SE e resista contra inundações http como: ab -n 1000 -c 100 http: // {host} /

    
por Dmitry Belyaev 16.07.2015 / 13:18
0

Sim, o método detalhado na sua pergunta funciona apenas através do número de novas conexões por unidade de tempo sem qualquer conhecimento do endereço IP que faz a conexão. Em um cenário de um alto volume de conexões de alguns endereços IP, o método é defeituoso porque aumenta a probabilidade de que a conexão legítima de visitantes seja bloqueada.

Eu uso um método pelo qual uma vez que um endereço IP "bad_guy" é detectado, ele é banido por um dia. Devido aos limites padrão (que poderiam ser alterados, mas não o fiz) na recente contagem de ocorrências do módulo, o método usa várias tabelas com um "carry" de um para o outro. A configuração adequada para ambos os gatilhos razoavelmente cedo para um "bad_guy" e evitar falsos positivos para um "good_guy" seria específica do site e levaria algum tempo. Primeiro, no ponto normal da cadeia INPUT:

# If required, go to NEW HTTP connection sub-routine
#
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in

E no início do script, eu tinha este código:

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in3
#
# A NEW Connection on port 80 part 3.
#
# carry forward to the actual banned list:
# Increment this count. Leave the previous count.
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
$IPTABLES -N http-new-in3
$IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02
$IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4
$IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN

$IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info
$IPTABLES -A http-new-in3 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in2
#
# A NEW Connection on port 80 part 2.
#
# carry forward from previous max new connections per unit time:
# Increment this count and clear the lesser significant count.
#
$IPTABLES -N http-new-in2
$IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01
$IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3
$IPTABLES -A http-new-in2 -m recent --set --name HTTP_02

$IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info
$IPTABLES -A http-new-in2 -j ACCEPT

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in
#
# A NEW Connection on port 80:
#
$IPTABLES -N http-new-in

echo Allowing EXTERNAL access to the WWW server

# . check the static blacklist.
#
$IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP
$IPTABLES -A http-new-in -i $EXTIF -s 91.200.0.0/20 -j DROP
... deleted big list of ip addresses ...
$IPTABLES -A http-new-in -i $EXTIF -s 82.80.0.0/16 -j DROP

# . check the dynamic banned list
#
# The 1 Hour banned list (bumped to more than a day):
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP

# A generic log entry. Usually only during degugging
#
#$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info

# Dynamic Badguy List. Least significant hit counter.  Detect and DROP Bad IPs that do excessive connections to port 80.
#
$IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2
$IPTABLES -A http-new-in -m recent --set --name HTTP_01

$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info
$IPTABLES -A http-new-in -j ACCEPT

O método é adaptado desta referência .

    
por Doug Smythies 16.07.2015 / 17:36

Tags