Limitar conexões simultâneas por IP com o Apache2

2

Estou hospedando um serviço público da web pesado da CPU e gostaria de configurar o Apache2 para permitir somente uma conexão simultânea por endereço IP para o local em questão, para impedir que clientes únicos usem muitos recursos.

Existe uma solução apache2 perfeita para fazer isso? Eu olhei em mod_bw mas isso não parece fazer o truque (o MaxConnections só se aplica a todos os usuários, não por IP). Existe também um módulo chamado apache2-mod-limitipconn, mas este não tem pacotes pré-compilados e eu acho que é mais mantido como o site está morto. Eu preferiria algo que eu possa incluir como uma dependência formal no Ubuntu.

    
por Jeroen 28.03.2011 / 07:01

5 respostas

0

Da minha experiência é um pouco mais complicado do que apenas limitar "uma conexão por IP" eu tenho medo (não é sempre :-)).

No entanto, havia outros parâmetros configuráveis, como "MinSpareServers, MaxSpareServers e StartServers" (não tenho certeza se eles ainda existem, mas certamente estavam no Apache 2.0).

Além disso, aparentemente, a compactação da saída pode melhorar as necessidades de largura de banda e acelerar o tempo de resposta em até 75% com "mod_deflate", se isso ajudar.

"mod_bandwidth" pode oferecer alguma ajuda em vez de tentar limitar uma única conexão e é provavelmente o caminho que eu percorreria depois de analisar a compactação.

Ou se você pode escrever C, você pode criar um módulo para contar as conexões por IP.

A coisa a ser observada é o que acontece quando um IP recebe uma única conexão. Vamos apenas dizer que geralmente não é uma visão bonita! Você pode ir para uma página "Server Busy" ou similar, mas eu vou seguir a rota de otimizar seu servidor, então é bom como pode ser do que frustrar os visitantes.

    
por 28.03.2011 / 08:06
6

Não tenho certeza sobre o módulo do apache, mas você pode usar o iptables para ele. Aqui está o howto sobre o módulo connlimit: link

Na sua situação, algo como seguir funcionaria:

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

No entanto, conforme mencionado em outras perguntas, tenha cuidado: essa regra pode bloquear alguns robôs legimitivos (como o rastreador do google) ou ISPs / organizações que usam o NAT e compartilham um único endereço IP para um grande número de usuários.

    
por 28.03.2011 / 09:21
3

Você pode usar o módulo http do mod_qos.

QS_SrvMaxConnPerIP <number> [<connections>]

Define o número máximo de conexões por endereço IP de origem para este servidor (host virtual). O argumento "connections" define o número de conexões ocupadas do servidor (todos os hosts virtuais) para habilitar esta limitação; o padrão é 0 (o que significa que a limitação está sempre ativada, até mesmo o servidor está inativo).

Mais detalhes no link .

Exemplo:

LoadModule qos_module path_to_module/mod_qos.so
<IfModule mod_qos.c>
        # max connection per IP is
        QS_SrvMaxConnPerIP 15 
</IfModule>

<VirtualHost *:80>
...
</VirtualHost>
    
por 23.02.2017 / 11:27
2

Eu só tinha a necessidade oposta - o apache2 estava servindo apenas uma página por vez por IP. Se isso levasse muito tempo, o carregamento de outra página em outra guia não seria iniciado até que quaisquer outras para o servidor que eu solicitei fossem concluídas.

Eu sabia que estava relacionado a sessões e encontrei a resposta completa aqui e aqui .

    
por 22.08.2012 / 20:23
1

Uma conexão por endereço IP não vai funcionar. Um navegador da Web usará uma conexão para baixar a página da Web e, em seguida, mais de 10 conexões simultâneas para obter todas as imagens, css, javacripts etc. Assim, se você limitar por IP, o usuário obterá a página principal e talvez algumas imagens e isso é tudo.

O único caso de uso pelo qual o limite de IP funciona é se você tiver um servidor de download dedicado e não quiser que as pessoas usem aceleradores de download. Aka, RapidShare.

Você precisa analisar como os usuários abusivos de sites estão abusando de seus serviços e segmentá-los. Se você limitar todo mundo, todo mundo vai se machucar.

Se for um problema de tráfego excessivo, você precisará otimizar o site ou adicionar mais ciclos de CPU com hardware mais rápido.

    
por 28.03.2011 / 08:43