[FUG-BR] Balanceamento de carga de saida (Usando programa especial).
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
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
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