Iptables, NAT: evitando o limite no número máximo de pedidos por IP usando vários IPs

1

Na minha rede, existe uma máquina que tem que fazer uma requisição http para um servidor que está além do firewall.

O endereço IP desta máquina (visto de fora do firewall) pode ser escolhido de um conjunto de cerca de 5 endereços.

Cada ip pode executar um número máximo de solicitações por dia, depois disso, ele não pode ser usado novamente até o dia seguinte; o intervalo de tempo entre dois pedidos não importa, desde que o limite diário não seja alcançado .

Eu gostaria de configurar a tabela de roteamento do firewall para que, na máquina cliente, eu possa fazer solicitações http sem me preocupar com o intervalo de tempo entre elas. Minha única preocupação deve ser o limite diário total (ou seja, o número de ips * solicitações máximas por ip).

Eu tentei algo como:

iptables -m hashlimit -m tcp -A POSTROUTING --syn --hashlimit-name x --hashlimit <MAX REQUESTS>/day -p tcp -s <CLIENT IP> -d <SERVER IP> --dports 80 --to-source <ONE OF THE IPs TO CHOOSE FROM>

E repetiu esse comando para todos os cinco ips (com uma regra final que diminui as tentativas de conexão)

Mas com essa configuração não consigo fazer solicitações em rajadas. Por exemplo, se MAX_REQUESTS for 9000, não será possível fazer 9000 solicitações nos primeiros dois minutos, porque o módulo hashlimit lida com médias e pára de corresponder a uma regra assim que a contagem de pacotes estiver acima da média especificada. Portanto, com essa configuração eu posso usar esse ip apenas uma vez a cada 9,6 segundos (= 86400/9000): não o que eu quero.

Então, estou pedindo sugestões sobre uma possível regra iptables (ou outra coisa) que me permita realizar solicitações em rajadas e permanecer dentro do limite diário.

Obrigado pelo seu tempo

Silvio

EDIT: Eu tentei usar --hashlimit-burst N , mas esse parâmetro só insere uma tolerância para os primeiros N pacotes, isto é, adiciona N pacotes que podem corresponder à regra independentemente da média, após o qual o condições normais se aplicam. Mais uma vez, não o que eu quero.

UPDATE : O comando iptable do candidato atual que estou usando é

iptables -m hashlimit -m multiport -m tcp -A POSTROUTING -t nat --syn --hashlimit-name NAME --hashlimit MAX_REQUEST/day -p tcp -s SOURCE_IP -d DESTINATION_IP --dports 80 -j SNAT --to-source ONE_OF_THE IPs

Ainda tem o problema mencionado acima (não é possível enviar pacotes em rajadas).

    
por Silvio Donnini 19.07.2010 / 17:15

1 resposta

2

Para um controle rígido, eu tentaria algo ao longo das linhas:

iptables -t nat -A POSTROUTING -s INT_SRC -d EXT_SERVICE --syn --limit MAXREQ/day -j SNAT --to-source EXT_IP1
...

(então acho que é isso que você já tentou: p)

Que tal usar:

iptables -t nat -A POSTROUTING -s INT_SRC -d EXT_SERVICE --syn -j SNAT --to-source EXT_IP_RANGE

Aparentemente, essa variante usa um algoritmo round-robin simples - eu tentaria isso. Espero que seus IPs externos estejam em um único intervalo:)

Não é possível deixar que outras solicitações falhem por conta própria? Dado que você tem requisitos muito específicos, eu provavelmente:

  • adicione um --log à regra
  • escreve um daemon que monitora o número de conexões de serviço feitas naquele dia e insere uma regra no FORWARD que descarta conexões adicionais com esse serviço
  • faça o daemon remover essa regra (se presente) à meia-noite e redefina sua contagem de conexões

Não parece haver nada que já exista para lidar exatamente com o que você deseja fazer.

    
por 19.07.2010 / 20:09