Como Controlar o Número de Conexões (connlimit)

Tutoriais BrazilFW 2.x em Português

Como Controlar o Número de Conexões (connlimit)

Mensagempor reginaldo » Sáb Abr 11, 2009 5:07 pm

Este tutorial sobre connlimit (Número de Conexões) é a união dos seguintes tutoriais:

1 - Usando o connlimit = Autor: Rôney Eduardo O. Santos tendo como Fonte o "UnderLinux Wiki"

2 - Controlando o número de conexões = Autor: Marcelo - Brazil.


*************************************************************************************************************************************

    1 - Usando o connlimit

Tutoriais/Seguranca/Usando o Connlimit from UnderLinux Wiki

Pessoal, muito se tem discutido aqui no fórum sobre esse tipo de implementação, suas implicações e uso, etc...quanto nas seções Wireless, há ainda muitas dúvidas quanto sua aplicabilidade. Bom, resolvi então escrever meu relato de como estou usando o connlimit aqui, tanto no aspecto de como tenho implementado, como tenho feito para solucionar problemas e também sobre como não gerar problemas com seu uso.

Bom, a minha necessidade de fazer essa implementação foi pelo fato de simplesmente não conseguir oferecer acesso à redes p2p (emule, kazaa, etc..) para meus clientes (sou um provedor de internet), visto que um único cliente, com o emule funcionando, por exemplo, abre mais de 250 conexões simultâneas, isso baixando apenas um único arquivo...imagina então um tarado com uma fila de uns 50~100 arquivos...ai já era. Os rádios nas minhas repetidoras simplesmente não aguentavam tantas requisições simultâneas...Dava latência alta, desconexões...

Então, analisando o tráfego desse tipo de software, eu percebi que tinha que atacar diretamente o fato deles abrirem muitas conexões simultâneas. Então corri atrás de recompilar meu kernel e o meu iptables com o pom (patch-o-matic) e adicionar o módulo CONNLIMIT.

Aqui eu uso um servidor CentOS como gateway de acesso, controle de banda e firewall.

A implementação, basicamente no firewall (vou postar aqui somente o que se refere ao connlimit), foi essa:

1) Crio uma cadeia chamada CONNLIMIT:

iptables -N CONNLIMIT

2) Redireciono todos os acessos (portas) que gostaria de limitar para a cadeia CONNLIMIT (no caso, as portas acima de 1024, basicamente, visto que esses softwares tarado usam portas altas, porém, tomando cuidado de deixar fora do controle as portas de serviços conhecidos, como MSN e afins, jogos on-line, vnc, proxy, etc...vou dar alguns exemplos):

Código: Selecionar todos
iptables -A FORWARD -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT # excluindo o MSN = 1863

iptables -A FORWARD -p TCP -d 0/0 --dport 1864:3127 -j CONNLIMIT # excluindo a porta do proxy = 3128

iptables -A FORWARD -p TCP -d 0/0 --dport 3129:5599 -j CONNLIMIT # excluindo a porta do VNC = 5600

iptables -A FORWARD -p TCP -d 0/0 --dport 5601:5899 -j CONNLIMIT # excluindo outra porta do VNC = 5900

iptables -A FORWARD -p TCP -d 0/0 --dport 5901:7776 -j CONNLIMIT # excluindo o jogo on-line Lineage = 7777


e assim por diante, eu faço "ranges" de IP que excluam as portas de serviços "saudáveis". Ah, e eu também uso o "-p TCP" ou seja, trabalhando apenas com o protocolo TCP, pois o CONNLIMIT só funciona com TCP. Existia um tempo atrás um módulo UDPLIMIT, mas ele é antigo, não sei se dá pra aplicar ele no kernel e no iptables mais recentes...

3) Agora como todo esse acesso tá passando pela cadeia CONNLIMIT, eu aplico nela a limitação:

Código: Selecionar todos
iptables -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 12 --connlimit-mask 32 -j DROP


Aqui é que tá o segredo do negócio...hehehe...seguinte:

obs1: "-m state ! --state RELATED" = usando isso, eu não incluo no DROP os pacotes que forem de retorno, ou seja, se você acessa um site (na porta 80), quando ele mandar uma resposta pra você, ele vai responder nas portas altas (acima de 1024), então, como essa conexão é uma conexão de retorno, excluindo o RELATED não aplica o connlimit, evitando problemas na navegação (principalmente de clientes com rede cheia de computador e com muita requisição - frisando que pra mim, esse cliente é um único IP, porém seus computadores estão todos por trás de NAT.

obs2: "--connlimit-above 12" = diz que o máximo é 12 conexões simultâneas.

obs3: "--connlimit-mask 32" = diz que ele vai tratar todos os IPs que passarem pela regra serão tratados isoladamente (ou seja, com a máscara /32, ou, 255.255.255.255), o que significa que serão 12 conexões simultâneas por IP -> 12 por cliente.

Bom é isso. Agora rola p2p na rede, sem prejudicar a qualidade, sem derrubar repetidora, etc, etc...Mesmo quem insista que os software p2p usem portas UDP, e o connlimit não limita UDP, o tráfego UDP é sempre muito menor que o tráfego TCP, da ordem de 1/4 + ou - , ou seja, limitando o número de conexões simultâneas TCP, o número de conexões UDP ficam limitadas aqui.

Vou mostrar também agora alguns dados.

Usando o aplicativo IPTSTATE, eu posso listar todas as conexões ativas por IP, todas as conexões ativas no geral (de todos os clientes), etc..então, com ele, eu posso analisar aqui as conexões simultâneas. Então ai vão alguns dados (obs1: eu sempre vou analisar somente as conexões ESTABLISHED - estabelecidas - as demais - CLOSED, TIME WAIT, etc. - eu vou deixar de fora, já que não interessam):

1) Quantidade conexões simultâneas (num cliente que tá com p2p ligado agora):

# iptstate -s | grep 10.0.0.6 | grep ESTAB

10.0.0.6,1040 207.46.110.87,1863 tcp ESTABLISHED (porta excluida) - msn

10.0.0.6,4172 201.72.219.110,4662 tcp ESTABLISHED (1) - emule

10.0.0.6,4173 200.233.133.1,4662 tcp ESTABLISHED (2) - emule

10.0.0.6,4183 201.69.97.126,4662 tcp ESTABLISHED (3) - emule

10.0.0.6,1046 207.46.111.69,1863 tcp ESTABLISHED (porta excluida) - msn

10.0.0.6,3626 201.50.84.53,4662 tcp ESTABLISHED (4) - emule

10.0.0.6,3948 201.215.155.80,4662 tcp ESTABLISHED (5) - emule

10.0.0.6,4170 62.10.87.177,5806 tcp ESTABLISHED (6) - emule

10.0.0.6,2337 207.46.27.79,1863 tcp ESTABLISHED (porta excluida) - msn

10.0.0.6,3387 81.169.143.167,7777 tcp ESTABLISHED (7) - emule

200.211.148.33,3028 10.0.0.6,1353 tcp ESTABLISHED (porta excluida) - proxy

10.0.0.6,4291 82.158.203.9,28043 tcp ESTABLISHED (Cool - não sei o que é

10.0.0.6,3387 81.169.143.167,7777 tcp ESTABLISHED (porta excluida) - jogo on-line

10.0.0.6,4266 201.20.241.170,22493 tcp ESTABLISHED (9) - nao sei o que é

10.0.0.6,4340 201.221.26.22,82 tcp ESTABLISHED (porta excluida)

Então, são 16 conexões simultâneas, porém apenas 9 entram no bloqueio/limite...ainda tem espaço pra mais 3 de p2p por exemplo...as portas excluidas são aquelas que não passam pelo CONNLIMIT.

2) Quantidade de conexões simultâneas no geral de uma repetidora (com 176 clientes):

# iptstate -s | grep ESTAB | wc -l = 2610
então: Qtde. de clientes * 12 = 176 * 12 = 2112

Qtde. de conex. na porta 80 (navegação):

# iptstate -s | grep ESTAB | grep ",80 " = 934
Qtde. de conex. na porta 1863 (MSN - o mais usado hehehehe):

# iptstate -s | grep ESTAB | grep ",1863 " = 605
Qtde. de conex. na porta 443 (páginas com SSL)

# iptstate -s | grep ESTAB | grep ",443 " = 176
Bom, a maioria dos acessos, como dá pra ver, são de portas saudáveis...o resto eu ainda nem contabilizei, e ainda tô fazendo isso num horário de folga, sem muito uso!

Bom, a intenção desse mini-artigo é dar uma idéia de como é implementar o connlimit (visto que há muita discussão por aqui sobre isso) e também de mostrar como fazer pra analisar essa questão das conexões simultâneas e como fazer pra atacar essa situação, deixando sua rede mais saudável, porém, sem prejudicar alguns serviços essenciais.

Galera, por favor, façam seus testes e postem os resultado, lembrando que o espaço aqui é justamente pra somarmos conhecimentos, portanto, peço a colaboração dos demais usuários do Underlinux!


Grande abraço a todos!

Rôney Eduardo O. Santos

Fonte: :arrow: http://under-linux.org/wiki/index.php/Tutoriais/Seguranca/Usando_o_Connlimit

********************************************************************************************************************************************

2 - Controlando o número de conexões

Após pesquisas aqui no forum sobre regras de como controlar a quantidade de conexões abertas, cheguei a um conjunto de regras que hoje as utilizo e com plena funcionalidade.

Essas regras estão projetadas para controlar conexões P2P, ou seja o cliente pode abrir centenas de conexões HTTP, SMTP, DNS, POP3 (todas abaixo de 1024).

Na opção "Configuração Avançada do Firewall" selecione "Editar Regras Personalizadas" e coloque no final:

Código: Selecionar todos
# limite de conexões
iptables -t mangle -F CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
iptables -t mangle -X CONNLIMIT
iptables -t mangle -N CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
iptables -t mangle -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP


Explicação do que essas regras fazem:

iptables -t mangle -F CONNLIMIT
# Dá um flush nas regras da Chain CONNLIMIT

iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
# Apaga a regra (assim, quando der um reload no firewall, esta regra não se repetirá)

iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
# Mesma descrição anterior

iptables -t mangle -X CONNLIMIT
# exclui a chain CONNLIMIT

iptables -t mangle -N CONNLIMIT
# Cria a Chain CONNLIMIT

iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
# Adiciona na Chain POSTROUTING que quando houver uma conexão que a porta destino for de 1024 a 1862, redirecione-a para a Chain CONNLIMIT

iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
# Aqui é a mesma descrição da regra anterior mas com as portas destino entre 1864 a 65535

iptables -t mangle -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP
# Adiciona a regra na Chain CONNLIMIT que quando a quantidade de conexões seja maior que 10, tratando os IPs separadamente, então jogue o pacote fora (DROP).

Essas regras se aplicam a CADA IP SEPARADAMENTE, mas se voce quiser fazê-las para a rede inteira, ficaria assim:
iptables -t mangle -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP

CUIDADO pois assim, TODA A REDE SÓ ABRIRÁ 10 CONEXÕES CONCORRENTES NESTE INTERVALO DE PORTAS AO MESMO TEMPO.

Exemplo completo:

Código: Selecionar todos
# limite de conexões para toda a rede
iptables -t mangle -F CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
iptables -t mangle -X CONNLIMIT
iptables -t mangle -N CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
iptables -t mangle -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP


Código: Selecionar todos
# limite de conexões por cliente
iptables -t mangle -F CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
iptables -t mangle -X CONNLIMIT
iptables -t mangle -N CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1024:1862 -j CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 --dport 1864:65535 -j CONNLIMIT
iptables -t mangle -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP



Código: Selecionar todos
# Limitar conexões em TODAS as portas
iptables -t mangle -F CONNLIMIT
iptables -t mangle -D POSTROUTING -p TCP -d 0/0 -j CONNLIMIT
iptables -t mangle -X CONNLIMIT
iptables -t mangle -N CONNLIMIT
iptables -t mangle -A POSTROUTING -p TCP -d 0/0 -j CONNLIMIT
iptables -t mangle -A CONNLIMIT -p TCP -m state ! --state RELATED -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP



P.S.: Pessoal, tem que ter o addon ADVROUTE.TGZ para que essas regras funcionem.
Código: Selecionar todos
http://www.brazilfw.com.br/downloads/addons/advroute.tgz
Contribua para que o Projeto BFW permaneça no ar, Doe Click aqui
Contribua com o reginaldo, Doe, favor enviar e-mail para reginaldo@brazilfw.com.br
-----------------------------------------------------------------------------------------------------
"Disciplina é liberdade. Compaixão é fortaleza. Ter bondade é ter coragem" (Há Tempos [Dado Villa-Lobos/Renato Russo/Marcelo Bonfá])
Avatar do usuário
reginaldo
BFW Mediator
BFW Documenter
BFW Manager
BFW 3.x Update
 
Mensagens: 12686
Registrado em: Sáb Ago 27, 2005 12:10 pm
Localização: Rio de Janeiro - RJ
BrazilFW Box: Máquina Física
CPU: Intel Core i3 Model 530
Memória: 8.00 GiB / 2 Links
BFW 3.0.262 64 bits
Serviços Ativos: Control MAC, QOS
Addons: EBackup, EPM e Squid 3.5.x

Voltar para BrazilFW 2.x

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron