Proibir um IP quando o servidor recebeu uma quantidade de dados dele

5

O que eu preciso:

Existem muitos resultados para adicionar regras de descarte por uma quantidade de solicitações por intervalos de tempo, mas preciso diminuir a contagem de bytes recebidos de um determinado endereço durante um período de tempo.

O que eu investiguei:

Eu olhei para o iptables: no primeiro caso, eu vi uma correspondência dedicada. . Também vi a correspondência de cota , mas a contagem de dados é rastreado globalmente.
Não tenho ideia de como misturar as duas regras para rastrear os dados recebidos por IP.

Outras coisas:

Estou ciente de que o rastreamento da contagem de bytes por IP pode usar muita memória, e é por isso que também quero manter o período curto.
Eu posso aceitar outros métodos, desde que haja um exemplo detalhado para isso.

    
por user2284570 08.05.2014 / 22:29

1 resposta

3

Você pode usar o IPSET com opções de tempo limite e contador. Isto será assim:

#create ipset for accounting with default lifetime 300 secs
ipset create IP_QUOTA_SET hash:ip timeout 300 counters

#create separated rule chain
iptables --new-chain PER_IP_QOUTING

#send packets to chain
iptables -t filter -A INPUT \
  -i <in-iface> --dst <ip>  \
  -p tcp --dport <dstport>  \
  -j PER_IP_QUOTING

#if ip doesn't exist in the set, add it
iptables -t filter -A PER_IP_QUOTING    \
  -m set ! --match-set IP_QUOTA_SET src \
  -j SET --add-set IP_QUOTA_SET src --timeout 300

#if packet exists in the set, check bytes
#if byte counter > quota then close connection
#by sending of tcp-reset packet.
iptables -t filter -A PER_IP_QUOTING    \
  -m set --match-set IP_QUOTA_SET src   \
  --bytes-gt 1000 -j REJECT --reject-with tcp-rst

#pass other packets (for debug purpose)
iptables -t filter -A PER_IP_QUOTING \
  -j RETURN

Nesse caso, você pode verificar a lista e editá-la pelo comando ipset. Mostrar lista atual com contadores e tempos limite: lista de ipset IP_QUOTA_SET.

Para mais detalhes, leia a documentação.

    
por 09.05.2014 / 18:12