Freesco, NND, CDN, EOS http://forum.freesco.pl/ |
|
Load Balance, Bandwidth and QoS http://forum.freesco.pl/viewtopic.php?f=22&t=10689 |
Strona 1 z 1 |
Autor: | stk [ czwartek, 12 stycznia 2006, 14:04 ] |
Tytuł: | Load Balance, Bandwidth and QoS |
Opá galera! Vendo que existe um grande interesse desse tipo de assunto, resolvi criar este artigo! O que não ficou claro, postem ae! Quem tiver mais alguma ideia, manda para japa@aloo.com.br. To pensando em fazer um howto! ##################################################################### # LOAD BALANCE ##################################################################### Vou tentar ser mais claro falando sobre estes dois assuntos! Divisão de cargas entre 2 ou mais links e qualidade de serviço. Com o script abaixo, pode-se fazer varias coisas relacionando com loadbalance. 1 - canalizar serviços para usarem um determinado link 2 - fazer serviços utilizarem 2 links, no metodo nexthop com peso #!/bin/sh echo "Inicializando procedimento de rotas" # RESETANDO TABELAS DE ROTAS, PADRAO DO SISTEMA echo "255 local" > /etc/iproute2/rt_tables echo "254 main" >> /etc/iproute2/rt_tables echo "253 default" >> /etc/iproute2/rt_tables echo "0 unspec" >> /etc/iproute2/rt_tables # ADICIONANDO OUTRAS TABELAS echo "200 router1" >> /etc/iproute2/rt_tables echo "201 router2" >> /etc/iproute2/rt_tables echo "202 router3" >> /etc/iproute2/rt_tables echo " declarando variaveis" GATE1=200.xxx.xxx.1 LINK1=200.xxx.xxx.3 GATE2=192.168.1.1 LINK2=192.168.1.2 # RESETANDO AS TABELAS echo " resetando as tabelas" ip route flush table router1 ip route flush table router2 ip route flush table router3 # CRIANDO A TABELA 1 echo " criando a tabela 1" ip route show table main | grep -v ^default | while read ROUTE ; do ip route add table router1 $ROUTE done ip route add $LINK1 via $GATE1 table router1 ip route add default via $GATE1 table router1 # CRIANDO A TABELA 2 echo " criando a tabela 2" ip route show table main | grep -v ^default | while read ROUTE ; do ip route add table router2 $ROUTE done ip route add $LINK2 via $GATE2 table router2 ip route add default via $GATE2 table router2 # CRIANDO A TABELA 3 echo " criando a tabela 3" ip route add default table router3 nexthop dev eth0 via $GATE1 weight 1 nexthop dev eth1 via $GATE2 weight 1 # CRIANDO AS REGRAS echo " criando regras" ip rule add from $LINK1 table router1 prio 26 ip rule add from $LINK2 table router2 prio 27 ip rule add fwmark 1 table router1 prio 29 ip rule add fwmark 2 table router2 prio 30 ip rule add fwmark 3 table router3 prio 25 # LIMPANDO CACHE echo " limpando cache" ip route flush cache Observe a parte de CRIANDO REGRAS, foram criadas 3, para pegar pacotes marcados e direciona-los a utilizar uma determinada tabela de roteamento. Preste atenção nos parametros aonde tem fwmark, isso determina o valor da marcação do pacote! Que tera que bater com o valor marcado no iptables. Foram criadas 3 tabelas: A primeira, utiliza um link A segunda, utiliza outro link A terceira faz nexthop entre as tabelas, a cada nova conexão dependendo do peso "weight". Exemplo1: peso 1 por 1, balança em media 50% por cada link! Exemplo2: peso 2 por 1, balança em media 66% por um link1 e 33% por outro link2! Para fazer isso tudo funcionar, teremos que ir para segunda etapa, utilizando iptables e marcando os pacotes! Exemplos: ### faz com que o servico dns faca consultas por um link $IPTABLES -t mangle -A PREROUTING -p TCP -i eth2 --dport 25 -j MARK --set-mark 1 ### faz com que o servico dns faca consultas por um link $IPTABLES -t mangle -A OUTPUT -p UDP --dport 53 -m owner --uid-owner 25 -j MARK --set-mark 2 ### faz o squid utilizar a tabela de roteamento com load balance $IPTABLES -t mangle -A OUTPUT -p TCP --dport 80 -m owner --uid-owner 23 -j MARK --set-mark 3 ##################################################################### # BANDWIDTH MANAGER ##################################################################### Os codigos mostrados abaixo são, adapatados a uma outra situação, diferente da citada acima! Desenvolvi esse script para facilitar o alguns controles de gerenciamento e bloqueio. Nesta situação eu criei uma lista de acessos (lista.clientes) No arquivo lista.clientes tenho: José|192.168.100.3|128|64|A estacao 002|192.168.100.4|256|128|B São 5 campos divididos por "|". e os valores são: nome|ip|downloadkbit|uploadkbit|status Se status for A está ativo e se for diferente fica como bloqueado! ou seja, não é aplicada regra para o mesmo! Segue abaixo o script add-htb.sh que eu uso #!/bin/sh IPTABLES="/sbin/iptables" TC="/sbin/tc" $TC qdisc del dev eth0 root $TC qdisc del dev eth1 root $TC qdisc add dev eth0 root handle 1: htb default 10 $TC qdisc add dev eth1 root handle 1: htb default 10 $TC class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit ceil 10240kbit $TC class add dev eth1 parent 1: classid 1:1 htb rate 1024kbit ceil 10240kbit $TC class add dev eth0 parent 1:1 classid 1:10 htb rate 10240kbit ceil 10240kbit prio 4 $TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 5 $TC filter add dev eth0 parent 1:0 protocol ip prio 4 handle 10 fw classid 1:10 $TC class add dev eth1 parent 1:1 classid 1:10 htb rate 10240kbit ceil 10240kbit prio 4 $TC qdisc add dev eth1 parent 1:10 handle 10: sfq perturb 5 $TC filter add dev eth1 parent 1:0 protocol ip prio 4 handle 10 fw classid 1:10 addrules() { #/ permite no firewall $IPTABLES -A FORWARD -s $ADDR -j ACCEPT $IPTABLES -A FORWARD -d $ADDR -j ACCEPT # para upload $TC class add dev eth0 parent 1:1 classid 1:$ID htb rate $UPLO ceil $UPLO prio 4 $TC qdisc add dev eth0 parent 1:$ID handle $ID: sfq perturb 5 $TC filter add dev eth0 parent 1:0 protocol ip prio 4 handle $ID fw classid 1:$ID $IPTABLES -t mangle -A FORWARD -s $ADDR -j MARK --set-mark $ID # para download $TC class add dev eth1 parent 1:1 classid 1:$ID htb rate $DOWN ceil $DOWN prio 4 $TC qdisc add dev eth1 parent 1:$ID handle $ID: sfq perturb 5 $TC filter add dev eth1 parent 1:0 protocol ip prio 4 handle $ID fw classid 1:$ID $IPTABLES -t mangle -A POSTROUTING -d $ADDR -j MARK --set-mark $ID } ID=11 LISTA=`cat lista.clientes` for CLIENTE in $LISTA; do NOME=`echo $CLIENTE | awk -F "|" '{print $1}'` ADDR=`echo $CLIENTE | awk -F "|" '{print $2}'` DOWN=`echo $CLIENTE | awk -F "|" '{print $3}'`"kbit" UPLO=`echo $CLIENTE | awk -F "|" '{print $4}'`"kbit" STAT=`echo $CLIENTE | awk -F "|" '{print $5}'` # checa se esta ativado if [ "$STAT" = "A" ]; then echo "ATIVO -> $NOME, $ADDR -> DOWN=$DOWN e UPLO=$UPLO" addrules else echo "BLOCK -> $NOME" fi # soma indice let "ID=$ID+1" done ##################################################################### # QOS em nivel de IPTABLES ##################################################################### É bem interessante! Mais ainda se integrar com a nova tecnologia do L7(layer7), que idependente da porta, a pessoa tem como descobrir o serviço que está rodando! Abaixo foram criadas chains para facilitar a manutenção do mesmo! Segue parte do script. ## TOS stuff: (type: iptables -m tos -h) ## Minimize-Delay 16 (0x10) ## Maximize-Throughput 8 (0x08) ## Maximize-Reliability 4 (0x04) ## Minimize-Cost 2 (0x02) ## Normal-Service 0 (0x00) $IPTABLES -t mangle -N MANGLE_POSTROUTING $IPTABLES -t mangle -F MANGLE_POSTROUTING $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 20 -j TOS --set-tos 8 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 21 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 22 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 23 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 25 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 53 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p udp --dport 53 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_POSTROUTING -p tcp --dport 80 -j TOS --set-tos 8 $IPTABLES -t mangle -N MANGLE_PREROUTING $IPTABLES -t mangle -F MANGLE_PREROUTING $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 20 -j TOS --set-tos 8 $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 21 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 22 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 23 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 25 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 53 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_PREROUTING -p udp --dport 53 -j TOS --set-tos 16 $IPTABLES -t mangle -A MANGLE_PREROUTING -p tcp --dport 80 -j TOS --set-tos 8 Agora é so chamar a chain, na tabela mangle do seu firewall! Rozumie ktos na jakiej zasadzie jest zrobiony LB w tym przykladzie ???? |
Autor: | Koriolan [ czwartek, 12 stycznia 2006, 16:42 ] |
Tytuł: | |
IMHO skrypt tworzy trzy tabele routingu. Ruch jest dzielony na 'niebalansowany' i 'balansowany'. Balansowany jest puszczany do 3 tabeli tak skonstruowanej, ze JĄDRO ( chyba; tu nie jestem pewien) samo przyporządkowuje ruch równomiernie. Zmusz go (chyba) ta linia : ip route add default table router3 nexthop dev eth0 via $GATE1 weight 1 nexthop dev eth1 via $GATE2 weight 1 Reszta już w miarę prosta ![]() |
Autor: | tasiorek [ czwartek, 12 stycznia 2006, 18:30 ] |
Tytuł: | Re: Load Balance, Bandwidth and QoS |
stk pisze: Rozumie ktos na jakiej zasadzie jest zrobiony LB w tym przykladzie ????
Na tej samej, co pozostale 2 sposoby, ktore mozna znalezc na forum (po polaczeniach). |
Strona 1 z 1 | Strefa czasowa UTC+2godz. |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |