Quais soluções de limitação de HTTP de saída existem?

5

Estou procurando uma maneira de gerenciar com flexibilidade o tráfego HTTP / HTTPS de saída de uma maneira que respeite as políticas do site e possa ser implantada na "borda" de nossa rede de datacenters.

Por exemplo, usamos várias APIs da Web com taxas de aceleração como "não mais de 4 solicitações por segundo" ou "máximo de 50 mil solicitações por dia", etc. Temos muitas pessoas na empresa que usam vários serviços como esses, por isso não posso gerenciar centralmente todas as solicitações no software. As pessoas executam essas coisas em horários diferentes e em diferentes intensidades. Estamos bem com isso (atende às necessidades internas), mas percebemos que - em conjunto - podemos entrar em situações em que geramos tanto tráfego simultâneo, que somos bloqueados por um site. (embora não seja intencional)

O que eu espero / espero é que possamos alavancar as soluções de gerenciamento de largura de banda / modelagem de tráfego que já existem no mundo de hardware de rede e que possamos implantar posteriormente tal coisa na borda da nossa rede de datacenter.

O ideal é que eu possa escrever regras de roteamento L4 ou L7 que nos permitam garantir que não mais do que - por exemplo - 4 saídas req / sa sejam geradas pelo nosso datacenter. O restante dos pedidos, de novo idealmente, seria enfileirado pelo hardware por um período de tempo razoável, com excesso de capacidade de fila simplesmente sendo recusado. Eu percebo que não há almoço grátis e que o afogamento não vai resolver um problema fundamental de demanda (solicitações) versus oferta (políticas do site). No entanto, o afogamento nos permitiria "suavizar" as solicitações por uma janela, digamos, por dia, para que pudéssemos utilizar um serviço externo de maneira adequada e restrita, maximizando nosso uso.

Alguém sabe de uma solução de gerenciamento de largura de banda em nível de rede como essa? Em caso positivo, também suportaria regras baseadas não apenas em algo como a URL em uma solicitação HTTP, mas também em alguns cabeçalhos HTTP adicionais?

    
por kvista 01.03.2011 / 18:47

1 resposta

4

As capacidades do netfilter são quase ilimitadas. Nesse eu usaria o módulo limite no iptables. Esteja ciente: não há como limitar as taxas no TCP / IP sem descartar pacotes. Você pode enfileirar os pacotes, mas, eventualmente, quando a fila está cheia, os pacotes são descartados. Então, vamos descartar os pacotes SYN. Eu não tentei isso até agora, provavelmente por causa de tempos limite de tentativas muito longos, ninguém está fazendo isso, ou seja, um navegador pode ficar bloqueado.

limit

This module matches at a limited rate using a token bucket filter. A rule using this extension will match until this limit is reached (unless the '!' flag is used). It can be used in combination with the LOG target to give limited logging, for example.

--limit rate Maximum average matching rate: specified as a number, with an optional '/second', '/minute', '/hour', or '/day' suffix; the default is 3/hour.

--limit-burst number Maximum initial number of packets to match: this number gets recharged by one every time the limit specified above is not reached, up to this number; the default is 5.

  1. Nós configuramos uma nova cadeia que limita a conexão. Por 4 segundos, ele retornará para a cadeia de chamadas, o restante será descartado.
  2. Novas conexões para a porta 80 são enviadas para essa nova cadeia.
iptables -N CONNRATELIMIT
iptables -A CONNRATELIMIT -m limit --limit 4/sec -j RETURN
iptables -A CONNRATELIMIT -j DROP

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j CONNRATELIMIT

Eu usei a cadeia secundária apenas para mostrar o conceito. Você também pode fazer isso em um roteador, então você tem que criar uma cadeia por servidor ou entidade que você deseja limitar. E use FORWARD ao invés de INPUT.

Fila

Nesta solução, não há enfileiramento de "longa duração". Você pode jogar com os parâmetros limite e limite-rajada . Também seria possível enviar os pacotes SYN para uma Disciplina de Enfileiramento: a configuração é muito mais complexa e não consigo ver como isso melhora as coisas com relação à eliminação de pacotes SYN.

correspondência de URL

A correspondência de URL também é possível, nesse caso, você descartaria esse pacote e atrasaria a conexão aguardando a retransmissão. Fiz essas coisas com o módulo recente , MAS usei-o para Impeça ataques de força bruta e portscanning. Então eu não me importo com as conexões que estou limitando. O manuseio adequado das conexões será difícil!

    
por 11.03.2011 / 09:31