Pesquisar neste blog

sexta-feira, 20 de dezembro de 2013

Como fazer cache de vídeos no Squid

Como fazer cache de vídeos do youtube no Squid

Do ano passado pra cá, o crescimento de vídeos explodiu no mundo. Um problema notado, porém, foi que os vídeos não eram cacheados no squid.
Foram criadas várias ferramentas para de redirecionamento, com menor ou maior grau de sucesso.
Aqui no trabalho, testamos uma alternativa, adicionando as linhas
acl googlevideo dstdomain .googlevideo.com
cache allow googlevideo
acl youtube dstdomain .youtube.com
cache allow youtube

no arquivo /etc/squid/squid.conf e o problema foi resolvido.
Importante. Essas linhas devem estar acima dessas duas:
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY

A explicação é simples.
RFC 2616, que define o HTTP 1.1, diz que não deve entrar no cache todo recurso que tiver na resposta os cabeçalhos:
  • Cache-Control: no-cache;
  • Pragma: no-cache;
  • Cache-Control: no-store;
Porém, o squid, por padrão, também proíbe o armazenamento a todo conteúdo cujas URLs contenham as strings "cgi-bin" ou o sinal que delimita parâmetros, o "?" (sinal de interrogação). Nos dois casos, o squid considera que certamente o conteúdo é dinâmico, e sequer verifica os cabeçalhos HTTP.
Conforme testes, verificamos que os vídeos continham um cabeçalho de expiração de algumas horas, além de não conter instruções nos cabeçalhos para não guardá-los. O que fizemos foi inserir uma regra dizendo que não é pra descartar de cara o conteúdo de googlevideo.com e youtube.com. A regra foi colocada antes por questão de prioridade.
Pudemos, assim, cachear tranquilamente os vídeos, atentos a um pequeno detalhe. O recurso é definido pela URL de requisição, o cabeçalho Vary da resposta (quando existir) e a ETag. Assim, essas duas URL abaixo são entidades diferentes, pois não atendem ao primeiro quesito:
  • http://dominio.com.br/?a=1&b=2
  • http://dominio.com.br/?b=2&a=1
Se você for corajoso, pode aumentar o tempo de vida do recurso com orefresh_pattern. Se for mais corajoso ainda, retire as linhas referentes à ACL QUERY e passe a confiar nas instruções de cache de todos os servidores HTTP que entrar (o que não é tão má ideia assim).
Como última dica, deixo a de aumentar o parâmetro maximum_object_size, pois o padrão é de apenas 4 MB.



O resultado no log do squid foi o seguinte (substituí os IPs por falsos):
# tail -n 5000 /var/log/squid/access.log|grep googlevideo
1244065234.402 1478259 10.10.5.7 TCP_MISS/200 9944050 GET http://v2.lscache6.googlevideo.com/videoplayback? - ROUNDROBIN_PARENT/200.200.200.29 video/x-flv
1244065379.699 129413 10.10.5.8 TCP_MISS/200 1042113 GET http://v22.lscache1.googlevideo.com/videoplayback? - ROUNDROBIN_PARENT/200.200.200.28 video/x-flv
1244065640.822    167 10.10.5.7 TCP_HIT/200 1042121 GET http://v22.lscache1.googlevideo.com/videoplayback? - NONE/- video/x-flv
1244065709.024   1590 10.10.5.8 TCP_HIT/200 9944059 GET http://v2.lscache6.googlevideo.com/videoplayback? - NONE/- video/x-flv
UPDATE: Veja meu outro post sobre como resolver o problema da efetividade e fazer 100% de acerto nas requisições: Cache efetivo de vídeos do Youtube com Squid

Fonte: http://lucianopinheiro.net/

segunda-feira, 9 de dezembro de 2013

Como usar ramais SIP em um servidor asterisk por NAT


asteriskQuando queremos proteger um servidor asterisk por trás de um firewall é necessário (pelo menos em IPv4) o uso de NAT para conseguirmos acesso ao mesmo. Vou tentar explicar de uma maneira simples os procedimentos necessários para a configuração.

1 - Subindo os módulos necessários (como root):
1# modprobe iptable_nat
2# modprobe ip_nat_sip
3# modprobe ip_conntrack_sip
Se você quiser pode acrescentar no seu script de firewall ou então:
1# echo "iptable_nat" >> /etc/modules
2# echo "ip_nat_sip" >> /etc/modules
3# echo "ip_conntrack_sip" >> /etc/modules
2 - Configurando o firewall:
Estamos partindo do suposto que você deve ser um admin precupado com a segurança e utiliza a política padrão da Chain FORWARD como DROP
Sendo assim temos:
Porta 2727: MGCP
Porta 4569: IAX2
Porta 5036: IAX1
Portas 5004 a 5082: SIP
Portas 10000 a 20000: RTP (aqui está o segredo para quem tentou fazer nat. A ramal registrou, faz a ligação mas quando atende, fica mudo. Quem ler sobre este protocolo entenderá o porquê)
Vamos ao que interessa então, acrescente ao seu script de firewall o seguinte (na variável que aponta para o servidor asterisk, substitua o valor para o IP correto pra você):
01# Habilitando forward
02echo 1 > /proc/sys/net/ipv4/ip_forward
03PORTAS_ASTERISK="2727,4569,5036"
04SERVIDOR_ASTERISK="192.168.0.50"
05# Forwarding de portas (entrada e saída)
06iptables -A FORWARD -p udp -m multiport --sport $PORTAS_ASTERISK -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
07iptables -A FORWARD -p udp -m multiport --dport $PORTAS_ASTERISK -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
08iptables -A FORWARD -p udp --sport 5004:5082 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
09iptables -A FORWARD -p udp --dport 5004:5082 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
10iptables -A FORWARD -p udp --sport 10000:20000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
11iptables -A FORWARD -p udp --sport 10000:20000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
12# Encaminhamento de portas para o servidor asterisk
13iptables -t nat -A POSTROUTING -p udp --dport 5004:5082 -d $SERVIDOR_ASTERISK -j MASQUERADE
14iptables -t nat -A PREROUTING -p udp -i $WAN --dport 5004:5082 -j DNAT --to $SERVIDOR_ASTERISK
15iptables -t nat -A POSTROUTING -p udp --dport 10000:20000 -d $SERVIDOR_ASTERISK -j MASQUERADE
16iptables -t nat -A PREROUTING -p udp -i $WAN --dport 10000:20000 -j DNAT --to $SERVIDOR_ASTERISK
17iptables -t nat -A POSTROUTING -p udp --dport 5036 -d $SERVIDOR_ASTERISK -j MASQUERADE
18iptables -t nat -A PREROUTING -p udp -i $WAN --dport 5036 -j DNAT --to $SERVIDOR_ASTERISK
19iptables -t nat -A POSTROUTING -p udp --dport 2727 -d $SERVIDOR_ASTERISK -j MASQUERADE
20iptables -t nat -A PREROUTING -p udp -i $WAN --dport 2727 -j DNAT --to $SERVIDOR_ASTERISK
21iptables -t nat -A POSTROUTING -p udp --dport 4569 -d $SERVIDOR_ASTERISK -j MASQUERADE
22iptables -t nat -A PREROUTING -p udp -i $WAN --dport 4569 -j DNAT --to $SERVIDOR_ASTERISK
3 - Preparando o servidor asterisk para suporte a NAT.
edite o arquivo sip.conf no seu servidor:
1# nano -w /etc/asterisk/sip.conf
No final do arquivo, acresente o seguinte:
nat=yes
externip=seu ip público
localnet=sua rede local/máscara de sub-rede
bindport=5060
save e feche o arquivo. Agora reinicie o serviço
1# /etc/init.d/asterisk restart
Pronto! o ambiente está preparado para receber os ramais SIP via NAT. Dúvidas, críticas construtivas e sugestões sempre são bem-vindas. Espero ter ajudado.


Fonte: Softwarelivre-ac.org