[FUG-BR] Balanceamento de carga de saida (Usando programa especial).

2007-02-04 Por tôpico Jorge Aldo
Estou tentando resolver meu problema de balanceamento de carga de saida 
usando um sistema servidor/discador. O sistema funciona da seguinte forma :

No servidor FreeBSD roda um daemon que aguarda por conecoes vindas de 
clientes.

Nos clientes (windows) existem dois aplicativos no desktop FreeGate 
Connect e FreeGate Disconnect.

Quando um usuário executa freegate.connect, este programa se comunica 
com o daemon no FreeBSD e envia-lhe o comando para conectar. Quando um 
usuário executa freegate.disconnect, este programa se comunica com o 
daemon no FreeBSD e envia-lhe o comando para desconectar.

Conectar e Disconectar significa ligar o ip do cliente windows à uma das 
saidas disponiveis (uma das wans).

Meu problema é o seguinte :

Apesar de já ter lido várias documentacoes sobre IPFW/IPFW2 não consigo 
determinar quais serão os comandos necessários para fazer essa ligação 
desligação. O daemon servidor lida com quatro scripts, a saber :

/etc/freegate/startup.sh - é executado quando o daemon é ativado
/etc/freegate/shutdown.sh - é executado quando o daemon é desativado
/etc/freegate/login.sh - é executado quando um usuario loga com o 
aplicativo, recebe o ip do mesmo como parametro
/etc/freegate/logout.sh - é executado quando um usuario desloga com o 
aplicativo, recebe o ip do mesmo como parametro.

Existem vários arquivos/tabelas que mostram o estado atual do sistema :
/etc/freegate/links.conf - contem a lista de todos os links WAN 
disponíveis nesse gateway, com informações de banda passante total.
O formato desta tabela é bem simples :

linkname,downlink,uplink,modemip,ifname,ifip,weight

onde : linkname é o nome generico do link (por exemplo velox1)
downlink, uplink são as taxas de descida e subida (ex : 1, 
60)
modemip é o ip do modem que esta conectado a esta interface (os modens 
devem estar como routers) (ex : 10.1.1.1)
ifname o nome da interface como dada pelo freebsd (ex : rl0)
ifip o ip da interface dado pelo modem (deve-se configurar o dhcp do 
modem para travar um ip a esta interface) (ex : 10.1.1.2)
weight é o peso deste link, representado por um numero entre 0 e 100 
que determina a probabilidade (%) de um cliente ser ligado a este link. 
(ex : 33)

/etc/freegate/activeips.tab - contem uma lista de todos os ips logados 
atualmente, esta lista é atualizada com o comando freegate.addip ip ou 
freegate.removeip ip

O formato desta tabela é simples tambem :
ipativo, link

onde ipativo é o ip do cliente da LAN que esta ativo (ex : 192.168.0.10)
link é o numero do link (na lista de links.conf) a que este link esta 
ligado


toda vez que um usuario loga, o daemon/servidor automaticamente chama 
login.sh ipdocliente
e este script deve criar pipes e regras de nat para rotear a partir 
dali, todos os pacotes do cliente por um dado link. Por default os 
pacotes de todas as maquinas devem ser bloqueados, o cliente so navega 
se rodar freegate.connect. Para ligar um cliente à um link, alem de 
acrescentar uma rota ipdocliente via ifname é preciso tambem criar 
um pipe limitando a banda do cliente à downlink / numero de clientes 
no link.

A maior parte do sistema já está desenvolvida/pronta. Estou tendo 
dificuldades apenas nesta parte do sistema.

Acho que um sistema assim solucionaria a dor de cabeca de muitas 
pessoas. Por favor ajude !

Desde já agradeço.
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


[FUG-BR] Portal Cativo

2008-06-25 Por tôpico Jorge Aldo
Seguinte, desenvolvi uma aplicacao de portal cativo que autentica 
usuarios contra um banco de dados sqlite (bem, depois posso mudar isso 
pra outra tecnologia, não é muito complicado).

O processo se dá em algumas etapas :

1 - Requisição original é interceptada e enviada para o servico 
redirecionador
O servico redirecionador analisa o pedido e envia uma página com uma tag 
meta http-equiv=refresh bla bla bla, com o endereço original num 
campo originalurl da query (para posterior uso) e com a query apontando 
para o servico do portal

2 - o servico do portal envia uma tela de login (configuravel) para o 
usuario (em https)

3 - o usuario loga, se por algum motivo não for autenticado, recebe uma 
mensagem de erro.

4 - se for autenticado, eh enviado para uma nova página de 
redirecionamento que decodifica o endereco originalmente requisitado e o 
redireciona para lá com uma nova
meta tag.

o servidor mantem um serviço pingador que envia alguns pings para as 
maquinas em estado ativo pra ver se elas ainda estao no ar. Quando uma 
maquina é desligada, não responde o ping e é marcada novamente como não 
logada.

na partida do servico ele chama um script chamado startall.sh e, para 
cada cadastrada no banco de dados, chama um script start.sh com id e ip 
como parametros

quando um usuario loga, o sistema chama um script chamado login.sh com 
id, ip, bandadesubida e bandadedescida como parametros

quando um usuario eh derrubado (por algum motivo inclusive se nao 
responder a 3 pings seguidos) o sistema chama um script chamado 
logout.sh com id e ip como parametros

meu problema consiste no seguinte :

Preciso fazer esses scripts de forma eficiente, meu objetivo eh 
desenvolver uma boa solução de portal cativo + controle de banda 
individual + squid proxy/cache para pequenos provedores wireless.

não sei nem por onde comecar com esses scripts ! já fiz alguns, estou 
botando eles em campo agora para fazer testes.

Fiz alguns testes nos servicos usando openload e o servidor suportou 
+50k requisições no total (nao travou, eu que cansei de esperar hehe) e 
parece estavel..

Para funcionar, ele de uma regra que faça os pacotes saindo da rede em 
direcao a porta 80 sejam redirecionados para a porta do servico de 
redirecionamento (configurei ele na porta 1932)

creio que o uso simultaneo do squid vai requerer que essa regra de 
redirecionamento seja apagada assim que o usuario fique online, 
substituindo-a por uma nova regra de redirecionamento desta vez 
apontando para o squid (em modo transparente).

Bem, todo esse trabalho eu pretendo publicar na licença BSD, mas ainda 
não posso faze-lo incialmente.
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


[FUG-BR] Portal Cativo

2008-06-30 Por tôpico Jorge Aldo
Como havia explicado em um email anterior, criei uma ferramenta de 
portal cativo para FreeBSD

O seguinte script é chamado quando o sistema (captivepinger) da a partida :

#!/bin/sh

ipfw -q -f flush   # Delete all rules

# Set variables
oif=rl0  # out interface
iif=dc0  # in intertace
iifaddr=192.168.2.1  # in interface ip
lannet=192.168.2.0/24# LAN subnet
redirector=1932  # captive portal redirector
portal=1934  # captive portal
admin=1933   # captive portal admin page
squid=3128   # squid

# Divert to NAT
/sbin/ipfw add 2 divert 8668 ip4 from any to any via rl0

# Allow estabilished traffic
/sbin/ipfw add 3 check-state

# Allow anything loopback
/sbin/ipfw add 4 allow ip from any to any via lo0

# deny external access to our loopback
/sbin/ipfw add 5 deny ip from any to 127.0.0.0/8
/sbin/ipfw add 6 deny ip from 127.0.0.0/8 to any

# allow anything outgoing (and returning for internally generated traffic)
/sbin/ipfw add 7 allow all from any to any via ${oif} keep-state

# allow any port in on our firewall
/sbin/ipfw add 8 allow ip from ${lannet} to ${iifaddr} via ${iif} keep-state

# allow any DNS
/sbin/ipfw add 9 allow tcp from ${lannet} to any dst-port 53 via ${iif} 
keep-state
/sbin/ipfw add 9 allow udp from ${lannet} to any dst-port 53 via ${iif} 
keep-state

# by default, send to our captive redirector
/sbin/ipfw add 65000 fwd ${iifaddr},${redirector} tcp from ${lannet} to 
any dst-port 80 in via ${iif} keep-state

/sbin/ipfw add 65100 deny ip from any to any
/sbin/ipfw add 65200 allow ip from any to any

- Este outro script eh chamado quando um usuario loga ( ${1} é o id 
no cadastro ${2} é o IP no cadastro ${3} é a banda de subida ${4} é a 
banda de descida, são parametros da linha de comando do script)

#!/bin/sh

# Set variables
oif=rl0  # out interface
iif=dc0  # in intertace
iifaddr=192.168.2.1  # in interface ip
lannet=192.168.2.0/24# LAN subnet
redirector=1932  # captive portal redirector
portal=1934  # captive portal
admin=1933   # captive portal admin page
squid=3128   # squid

/sbin/ipfw pipe ${1}1 config bw ${4}KBit/s
/sbin/ipfw pipe ${1}2 config bw ${3}KBit/s

/sbin/ipfw add 1${1}1 pipe ${1}2 ip from ${2} to any in
/sbin/ipfw add 1${1}1 pipe ${1}1 ip from any to ${2} out

/sbin/ipfw add 1${1}2 fwd 127.0.0.1,${squid} ip from ${2} to any 
dst-port 80 in via ${iif}

/sbin/ipfw add 1${1}3 skipto 65200 ip from ${2} to any in via ${iif}
/sbin/ipfw add 1${1}3 skipto 65200 ip from any to ${2} out via ${iif}

- Este é o script chamado quando o usario fica offline { ${1} id 
${2} ip )

#!/bin/sh

# Set variables
oif=rl0  # out interface
iif=vr0  # in intertace
iifaddr=192.168.1.1  # in interface ip
redirector=1932  # captive portal redirector
portal=1934  # captive portal
admin=1933   # captive portal admin page
squid=3128   # squid

ipfw delete 1${1}1
ipfw delete 1${1}2
ipfw delete 1${1}3

ipfw pipe delete ${1}1
ipfw pipe delete ${1}2

 fim ---

do jeito que esta ai o usuario é interceptado na entrada e é levado ao 
portal cativo, quando loga, passa a ser interceptado pelo squid e nao 
pelo portal, ate cair

o meu problema é que o controle de banda simplesmente não funciona !
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd