Como usar iptables ou tc para limitar pacotes por cliente.

5

Eu tenho alguns clientes de rede com problemas que enviam dados muito rápido.

Eu quero atrasá-los, usando iptables ou, possivelmente, tc.

Eu vi soluções do iptables como:

sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT

mas acho que o limite se aplica a tudo que corresponde à regra, e não ao endereço do cliente.

Existe uma maneira de fazer este pacote de limite de regras por endereço de cliente?

    
por fadedbee 04.02.2016 / 16:11

3 respostas

3

você pode resolver este problema de uma maneira simples, tente usar o módulo recente com o iptables, recentemente rastreie o endereço de origem:

iptables -m recent -h
recent match options:
[!] --set                       Add source address to list, always matches.
[!] --rcheck                    Match if source address in list.
[!] --update                    Match if source address in list, also update last-seen time.
[!] --remove                    Match if source address in list, also removes that address from list.
    --seconds seconds           For check and update commands above.
                                Specifies that the match will only occur if source address last seen within
                                the last 'seconds' seconds.
    --reap                      Purge entries older then 'seconds'.
                                Can only be used in conjunction with the seconds option.
    --hitcount hits             For check and update commands above.
                                Specifies that the match will only occur if source address seen hits times.
                                May be used in conjunction with the seconds option.
    --rttl                      For check and update commands above.
                                Specifies that the match will only occur if the source address and the TTL
                                match between this packet and the one which was set.
                                Useful if you have problems with people spoofing their source address in order
                                to DoS you via this module.
    --name name                 Name of the recent list to be used.  DEFAULT used if none given.
    --rsource                   Match/Save the source address of each packet in the recent list table (default).
    --rdest                     Match/Save the destination address of each packet in the recent list table.
    --mask netmask              Netmask that will be applied to this recent list.

exemplo para bloquear a força bruta do ssh:

iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --set
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --rcheck --seconds  30 --hitcount 2 -j DROP
    
por 04.02.2016 / 19:49
3

Eu fiz isso usando uma combinação de TC e iptables hashlimit. Eu criei um limitador de largura de banda de TC de saída na interface de LAN (para direcionar o tráfego de download) definido para 5 Mbits / segundo. Eu então uso o módulo hashlimit iptables na cadeia mangle de saída da interface, de modo que se a taxa do pacote exceder um certo limite, entre quaisquer dois endereços IP de origem e destino distintos, ele começa a classificar esses pacotes na classe de modelagem de tráfego TC 5 Mbit / s .

Você tem que definir o limite de pacotes corretamente, porém, e eu baseei meu no fato de que meu MTU é de 1500 bytes, então usei isso para calcular quantos pacotes por segundo seria criar um limite de 1,5 Mbits por segundo (1000 pacotes / segundo). Juntamente com a configuração do maior valor de burst possível no módulo hashlimit iptables (que, na minha configuração, parece ser 10.000), o resultado de tudo isso é que os downloads curtos são executados a toda velocidade, mas os mais longos começam a desacelerar como alguns pacotes são passou para a classe limitadora de largura de banda do TC, que então obviamente diminui a taxa de pacotes, etc. etc. É um truque, mas, surpreendentemente, funciona e funciona bem. E como TC é usado, nenhum pacote é descartado - simplesmente atrasado e desacelerado devido a ser empurrado para dentro da classe TC quando a taxa de pacote é atingida.

Isso está em uma caixa do CentOS 6. Eu acho que o material mais moderno permite que o módulo hashlimit suporte bytes por segundo, não apenas pacotes por segundo, o que é ainda melhor, mas eu tentei isso na minha configuração e ele apenas volta a usar pacotes por segundo.

Eu estou em um telefone celular agora, então não posso colar qualquer configuração, mas se você quiser alguns exemplos, me avise e eu vou editar esta resposta. Eu realmente gosto desta solução porque o limite que eu tenho é baseado em IP de origem e destino. Assim, o sistema vê cada combinação distinta src + dst IP como seu próprio fluxo de pacotes para limitação. O módulo hashlimit também suporta portas de origem e destino (basicamente qualquer combinação de IP de origem, porta de origem, IP de destino, porta de destino), assim você pode fazer a limitação por sessão entre IP + de origem e IP + de destino .

UPDATE

Então, abaixo está mais ou menos como você faz isso; experimentação será necessária.

tc:

/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit

iptables:

#!/bin/bash

[[ "$1" =~ ^[ADI]$ ]] || exit 1

for IPT in /sbin/ip{,6}tables
do
  $IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done
    
por 04.02.2016 / 22:06
0

Você pode resolver isso usando o módulo connlimit:

link

    
por 04.02.2016 / 19:38