CBQ + Cache Full (Squid)
Dica publicada em Linux / Introdução
CBQ + Cache Full (Squid)
Considerando que até o presente momento não encontrei na internet explicações ou regras eficientes para fazer cache full (Squid) com CBQ, e também considerando que há muita procura sobre o assunto, resolvi abordar o tema aqui objetivando facilitar a vida de muita gente que necessita desta informação.
# iptables -t mangle -A OUTPUT -p tcp -m connmark --mark 0 -m string --string "X-Cache: HIT" --algo kmp -j CONNMARK --set-mark 6
# iptables -t mangle -A OUTPUT -p tcp -j CONNMARK --restore-mark
# iptables -t mangle -A OUTPUT -p tcp -m mark --mark 6 -j CLASSIFY --set-class 1:9
Agora vamos entender:
1) O primeiro comando do iptables verifica se o pacote contém o cabeçalho "X-Cache: HIT", ou seja, se está no cache. Caso verdadeiro, marca o pacote com um número decimal qualquer, eu escolhi o número 6.
2) O terceiro comando do iptables encaminha para a classe ID 9 do CBQ caso o pacote esteja marcado com o número 6. Lembrando que a classe (ID 9) foi definida anteriormente através do nome do arquivo (cbq-0009.Cache-Full).
Arquivo: cbq-0009.Cache-Full
O nome do arquivo deve obedecer ao seguinte formato "cbq-." Onde é representado por 2 bytes em hexadecimal, cujo intervalo vai de 0002 a FFFF, que na verdade determinará a classe ID do CBQ e pode ser atribuído qualquer palavra, de preferência algo que identifique a regra.
Agora vamos entender:
1) DEVICE -> interface interna (eth1), velocidade real da interface (100Mbit), parâmetro que deve ser proporcional à velocidade da interface (/10).
2) RATE -> Definimos a velocidade em que será entregue o cache do Squid ao cliente (10Mbit).
3) WEIGHT -> Parâmetro que deve ser proporcional à velocidade RATE (/10).
4) PRIO -> Prioridade do tráfego da classe.
Neste arquivo não definiremos o parâmetro RULE porque a classe servirá para qualquer IP ou sub-rede.
Estou utilizando estas regras desde o início deste mês (julho/2008) numa máquina k6-III 400Mhz (Fedora 7 - squid 2.6.STABLE16 transparent) com 9 clientes e esta é a minha média (CPU load average 0.24).
Espero ter contribuído e desejo boa sorte àqueles que desejam fazer cache full com CBQ.
Implementando regras no iptables
Na verdade é o iptables quem vai fazer com que o cache do Squid seja entregue ao cliente na velocidade determinada na regra de CBQ. Obviamente não faremos nenhuma modificação nas configurações do Squid.# iptables -t mangle -A OUTPUT -p tcp -m connmark --mark 0 -m string --string "X-Cache: HIT" --algo kmp -j CONNMARK --set-mark 6
# iptables -t mangle -A OUTPUT -p tcp -j CONNMARK --restore-mark
# iptables -t mangle -A OUTPUT -p tcp -m mark --mark 6 -j CLASSIFY --set-class 1:9
Agora vamos entender:
1) O primeiro comando do iptables verifica se o pacote contém o cabeçalho "X-Cache: HIT", ou seja, se está no cache. Caso verdadeiro, marca o pacote com um número decimal qualquer, eu escolhi o número 6.
2) O terceiro comando do iptables encaminha para a classe ID 9 do CBQ caso o pacote esteja marcado com o número 6. Lembrando que a classe (ID 9) foi definida anteriormente através do nome do arquivo (cbq-0009.Cache-Full).
Criando as regras de CBQ
Primeiramente devemos criar um arquivo contendo as regras de CBQ para efetivar o cache full. No Fedora 7, os arquivos contendo as regras ficam em /etc/sysconfig/cbq.Arquivo: cbq-0009.Cache-Full
DEVICE=eth1,100Mbit,10Mbit
RATE=10Mbit
WEIGHT=1Mbit
PRIO=5
RATE=10Mbit
WEIGHT=1Mbit
PRIO=5
O nome do arquivo deve obedecer ao seguinte formato "cbq-." Onde é representado por 2 bytes em hexadecimal, cujo intervalo vai de 0002 a FFFF, que na verdade determinará a classe ID do CBQ e pode ser atribuído qualquer palavra, de preferência algo que identifique a regra.
Agora vamos entender:
1) DEVICE -> interface interna (eth1), velocidade real da interface (100Mbit), parâmetro que deve ser proporcional à velocidade da interface (/10).
2) RATE -> Definimos a velocidade em que será entregue o cache do Squid ao cliente (10Mbit).
3) WEIGHT -> Parâmetro que deve ser proporcional à velocidade RATE (/10).
4) PRIO -> Prioridade do tráfego da classe.
Neste arquivo não definiremos o parâmetro RULE porque a classe servirá para qualquer IP ou sub-rede.
Considerações finais
Considerando que estas regras de iptables exigem esforço do processador, não recomendo sua aplicação para quem tem inúmeros clientes requisitando conexões ao Squid.Estou utilizando estas regras desde o início deste mês (julho/2008) numa máquina k6-III 400Mhz (Fedora 7 - squid 2.6.STABLE16 transparent) com 9 clientes e esta é a minha média (CPU load average 0.24).
Espero ter contribuído e desejo boa sorte àqueles que desejam fazer cache full com CBQ.
Os módulos abaixo devem ser carregados:
modprobe ipt_CONNMARK
modprobe ipt_string