Posso limitar a transferência de dados dentro do prazo por endereço IP?

Posso limitar a transferência de dados dentro do prazo por endereço IP?

Estou hospedando alguns arquivos relativamente grandes em meu site e me ocorreu que seria trivial alguém criar um script que os baixasse continuamente, mastigando minha transferência de dados e me custando dinheiro. Sua conexão doméstica típica seria rápida o suficiente para me causar problemas se deixasse o download 24 horas por dia, 7 dias por semana, muito menos uma conexão de fibra super rápida ou um servidor remoto adequado.

Então, estou me perguntando se há algo disponível para o Apache ou mesmo para todo o sistema Ubuntu que imponha restrições por endereço IP? Por exemplo, transferência de 10 GB por 24 horas. Quando o limite for atingido, o cliente receberá uma página leve "proibido - cota atingida" ou terá a conexão totalmente recusada. Procurei e não encontrei nada além de várias soluções de limitação, que podem ajudar, mas não resolveriam o problema.

Responder1

Existe o módulo de cota iptables documentado aqui:http://ipset.netfilter.org/iptables-extensions.man.html#lbBT

quota
    Implements network quotas by decrementing a byte counter with each
    packet. The condition matches until the byte counter reaches zero.
    Behavior is reversed with negation (i.e. the condition does not match
    until the byte counter reaches zero).

    [!] --quota bytes
           The quota in bytes.

Não acho que isso vá ajudá-lo, pois, usando esse método, você provavelmente teria que criar regras de cota individuais para cada endereço IP de origem possível que pudesse entrar em seu servidor (o que é praticamente impossível). Você também precisaria integrar algum tipo de automação de script BASH para redefinir essas cotas a cada 24 horas (ou qualquer período), conforme mencionado aqui:Cota de tráfego IPtables - para cima e para baixo

Há muitos anos, brinquei com um módulo Apache que era capaz de fazer isso no nível do aplicativo por endereço IP. Essa pode ser uma abordagem melhor (não tenho certeza de quais módulos modernos estão disponíveis para Apache/Nginx que fariam isso - são necessárias mais pesquisas).

A única outra alternativa que eu sei que funcionaria melhor (na minha opinião) é usar o módulo iptables hashlimit em conjunto com tc (modelagem/policiamento de tráfego):http://ipset.netfilter.org/iptables-extensions.man.html#lbAY- usando esta abordagem, o tráfego só fica lento, mas nunca bloqueado. A razão pela qual isso pode ser mais viável é porque o módulo iptables hashlimit pode lidar com o rastreamento instantâneo de clientes, gravando endereços IP distintos e/ou "chaves hash" de porta de origem/destino à medida que entram em seu servidor. Publiquei uma resposta sobre como conseguir isso em outra questão relacionada, aqui:https://serverfault.com/a/754116/30506- mas, em resumo, você cria uma classe de modelagem de tráfego (limitador de largura de banda fixado em, digamos, 5 Mb/s) e, à medida que a taxa de pacotes das sessões por cliente atinge um limite específico, você começa a canalizar seus pacotes para essa classe, pacificando assim seu tráfego . Porém, no seu caso, a pacificação precisaria ser ajustada para operar durante horas, em vez de segundos.

Responder2

Olá e bem-vindo ao Server Fault!

A limitação de largura de banda pode ser feita usando iptableso limitmódulo.

Uma introdução muito boa a isso pode ser encontradaaqui

Um pequeno exemplo deste link para configurar a aceleração da largura de banda:

$ sudo iptables --flush  # start again
$ sudo iptables --new-chain RATE-LIMIT
$ sudo iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT
$ sudo iptables --append RATE-LIMIT --match limit --limit 50/sec --limit-burst 20 --jump ACCEPT
$ sudo iptables --append RATE-LIMIT --jump DROP

Parabéns aos autores Will Sewell e Jim Fisher do artigo mencionado!

informação relacionada