Tutorial Squid por Fernando Augusto Medeiros fams@pcplace.com.br PCPlace Informática, Linuxplace Velocidade de conexão provavelmente é um dos maiores problemas da Internet, a chegada do www trouxe junto com a multimídia, uma demanda por canais cada vez mais rápidos. As distancias inter continentais da Internet acabam tornando a expansão dos canais lenta, e mesmo assim os canais individuais dos provedores de paginas não podem suportar todas as requisições de todos os navegadores do mundo. Junto a isso temos outros grandes problemas, segurança contra invasores e numero de IP's disponíveis cada vez menor. Mas nem tudo esta perdido, e possível fazer com que as paginas sejam acessadas de redes mais próximas, conectar uma rede inteira a Internet com apenas um IA, impedir que as maquinas da Internet acessem a rede interna. Dentre as soluções possíveis para o problemas temos o PROXY para conectar com segurança e o CACHE para que as paginas sejam buscadas de servidores mais próximos, sendo assim apresentamos o SQUID o proxy-cache mais famoso e usado do mundo. Proxy quer dizer intermediário, o SQUID funciona sendo o "atravessador" entre a conexão do cliente e o servidor, neste meio do caminho ele armazena os objetos que foram solicitados e permite que as próximas requisições para os mesmos objetos possam ser respondidas por ele mesmo. A versão atual do squid possui as seguintes características: - Proxy e cache para HTTP, FTP e outros protocolos baseados em URL - Proxy para SSL - Cache Hierárquico - suporte para Proxy transparente - Políticas de controle de acesso extremamente Flexíveis - SNMP - Logs Avançados - DNS Cache Instalação: Primeiramente temos que escolher a maquina que o squid ira ficar. Uma maquina para comportar o squid não precisa de um processador rapidíssimo, o mais importante para ele e a memória RAM, o squid adora memória, quanto mais puder dar a ele melhor. A utilização de discos SCSI para a partição que ficará o cache também e muito bem vinda. Partiremos do pressuposto que a maquina em que o squid será instalado já tem a rede TCP/IP funcionando, Se o squid for ser usado para conectar uma rede privada (IP's inválidos na Internet como da classe 192.168.0.0/24) à Internet, a maquina precisara de 2 placas de rede ou no mínimo 2 IP's. (melhor o primeiro caso para entrar numa configuração de rede isolada) um kernel configurado com ipforward e masquerading e muito bem vindo para a construção de um Proxy transparente. Maquina exemplo para este teste. - K6 II 350 Mhz (não achei nada menor para vender, mas se quiser pode usar um 200, eu já instalei Squid em 486 e está funcionando razoavelmente bem) - 128 RAM - Disco IDE 3 GB para sistema e log. - Disco SCSI 9 GB para cache (em instalações mais modernas, um ATA/66 - 2 placas de rede (para isolar as redes) Obtendo o squid: Se for usuário de um sistema baseado em RPM pode consegui-lo nos endereços abaixo. rpmfind.net: ftp://rpmfind.net/linux/rawhide/1.0/i386/RedHat/RPMS/squid-2.3.STABLE2-4.i386.rpm Conectiva: ftp://ftp.conectiva.com.br/pub/conectiva/dsk/5.0/cd1/conectiva/RPMS/squid-2.3.1-cl.i386.rpm Se quiser obter o squid em formato tgz fonte* pode conseguir em: http://www.squid-cache.org/Versions/v2/2.3/squid-2.3.STABLE2-src.tar.gz (*)A compilação dos squid não entra no escopo deste artigo então quem quiser compilar o Tomando como base o rpm da conectiva, continuaremos a instalação. O squid não precisa de um linux com muita coisa, o único pacote necessário é a glibc e é claro, ele precisa estar com a rede TCP/IP funcionando. Um kernel com o ipmasquerading também é legal para a implementação do proxy transparente como veremos adiante. Comando para instalar o squid: #rpm -ivh i/caminho_para_onde_foi_salvo_o_arquivo_/squid-2.3.1-cl.i386.rpm Configuração: A configuração do squid é feita editando seu arquivo de configuração, o squid.conf. Na instalação do RPM ele estará no/etc/squid/. Use seu editor preferido para configurar o arquivo. O arquivo de configuração e muito bem explicado, as configurações padrão vem comentadas facilitando o entendimento. O squid trabalha "Escutando" uma porta TCP determinada, os clientes que querem acessar uma pagina Web, ftp, ssl fazem requisições nesta porta informando o servidor e o protocolo que querem utilizar e o squid faz a requisição na porta certa. A porta padrão do squid e a porta 3128 isto pode ser alterado com uma diretiva do squid.conf http_port, vamos usar a porta 8080 inserindo a seguinte linha no squid.conf: http_port 8080 Temos que decidir também onde será o diretório de cache e o tamanho do mesmo. Por padrão o squid está configurado para o diretório de cache ficar em /var/spool/squid, por questões de performance, segurança e gerenciabilidade é melhor que ele fique instalado em uma partição separada. Montaremos então a partição de cache no diretório /cache e configuraremos para que o cache fique lá. Para mudar o diretório do cache procure a linha cache_dir no squid.conf, provavelmente ela estará assim: #cache_dir ufs /var/spool/squid 100 16 256 Bem vamos entender os parâmetros. O primeiro diz respeito ao formato do cache, melhor não mudar isso, a outra opção e asyncufs que não esta compilada no RPM e ainda é instável. A segunda opção informa o diretório do cache, como resolvemos que o cache ficará no diretório /cache este valor deve ser mudado para /cache. O terceiro parâmetro e o tamanho do cache em Mega bytes, tendo um disco de 9GB, separados uns 20% para um overhead do linux mais o squid podemos selecionar 7GB. Os outros parâmetros dizem respeito a configuração dos diretórios do squid, não e necessário muda-los. Então nossa linha fica sendo: cache_dir ufs /cache/ 7000 16 256 (Note que não tem mais o # na frente) E possível inserir várias entradas cache_dir no squid.conf, ele ira anexar a nova área sem perder o cache anterior. Agora que já esta configurada a área de cache, primeiro e preciso assegurar que o squid terá direito de escrita no diretório de cache, o squid não roda como o root, ele usa um usuário definido no parâmetro do squid.conf, cache_effective_user, a distribuição da conectiva vem com o squid rodando com o usuário nobody, para fazer o squid rodar com outro usuário (o usuário squid por exemplo), troque o valor do parâmetro no arquivo de configuração. lembre-se que o usuário terá de ter acesso de leitura e escrita nos diretórios de cache e log. E hora de criar o cache. Digite na linha e comando: # squid -z Nesse momento o squid já esta pronto para ser executado mas nenhum usuário poderá passar por ele, e preciso configurar as ACL (Listas de Controle de Acesso) do squid. As ACL permitem especificar endereços de origem ou destino, domínios, horários, usuários, portas ou métodos de conexão ao Proxy, que servirão de base para permitir ou negar o acesso baseando-se em conjuntos dessas ACL's. Isto permite uma grande flexibilidade na configuração do SQUID: podemos, por exemplo, especificar quais endereços podem ser acessados, quais não podem ser acessados, que certo endereço somente pode ser acessado em determinado horário, que um usuário somente pode acessar a partir de uma maquina especifica, que um protocolo pode ou não ser utilizado, ou qualquer combinação dessas permissões/restrições. acl minharede src 192.168.0.0/255.255.255.0 | | | |_ > Domínio da ACL | | | | | |_ _ _ _ _ > Tipo de ACL | | | |_ _ _ _ _ _ _ _ _ > Nome da ACL | |_ _ _ _ _ _ _ _ _ _ _ _ _ > Comando de criação de ACL Isto cria uma ACL de nome minharede do tipo src (IP de origem) sendo seu domínio 192.168.0.0/255.255.255.0 uma rede classe C. Agora temos que dar permissão a esta ACL a diretiva que faz isso e o http_access Então temos que inserir no squid.conf http_access minharede allow | | |_> allow/deny (permite/nega) | | |_ _ _ _ _> ACL ( ACL's a que se aplica a regra) | |_ _ _ _ _ _ _ _ _ _ _ _ _> Comando de permissão. Mas isso não pode ser feito em qualquer lugar, o squid e meio chato com a ordem dos parâmetros. vamos ver como esta o arquivo padrão e quais alterações devem ser feitas para entendermos melhor. acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 21 443 563 70 210 1025-65535 acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multilink http acl CONNECT method CONNECT http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all Como podemos ver existem vários tipos de ACL, vamos nos ater a primeira, foi criada uma ACL do tipo src, isto significa maquina de origem, com nome "all" que corresponde a qualquer maquina existente. A ultima diretiva diz que a conexões correspondentes a diretiva all estão proibidas de continuar. A diretiva ACL tem de ser criada antes de ser conferido algum direito. Então agora a ordem das linhas deverá ser a seguinte: acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 21 443 563 70 210 1025-65535 acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multilink http acl CONNECT method CONNECT #ACL's Do usuário acl minharede src 192.168.0.0/255.255.255.0 #ACL correspondente a rede interna http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports #Regras do Usuário http_access allow minharede #permite conexões da rede interna http_access deny all Podemos ver que temos varias linhas para a ACL Safe_ports, isso merece duas considerações, primeiro e possível especificar vários parâmetros para uma ACL, seja dando um espaço entre os parâmetros ou colocando duas entradas para a mesma ACL assim se tivéssemos que permitir também a rede 192.168.1.0/255.255.255.0 poderíamos criar a ACL de duas formas: #Com espaço: acl minharede 192.168.0.1/255.255.255.0 192.168.1.0/255.255.255.0 #ou com duas linhas acl minharede 192.168.0.0/255.255.255.0 acl minharede 192.168.1.0/255.255.255.0 A segunda consideração e que por padrão as diretivas ACL são do tipo "OU", ou seja uma conexão pertencera a uma ACL se qualquer um dos parâmetros coincidir. No nosso exemplo, a rede 192.168.0.0 OU rede 192.168.1.1 coincidiram com a ACL. A ordem entre as diretivas ACL não e importante. Para as diretivas http_access a coisa funciona diferente, como podemos ver a diretiva de permissão da rede interna foi inserida antes do deny all. O squid lê as diretivas de CIMA para BAIXO, parando a comparação na primeira que coincidir. Além disso as diretivas http_access são do tipo "E", para que a diretiva entre em ação, a conexão tem de estar coincidindo com TODAS as ACL's especificadas. EX: acl all src 0.0.0.0/0.0.0.0 acl minharede src 192.168.0.0/255.255.255.0 acl horacom time MTWTF 09:00-18:00 http_access allow minharede horacom http_access deny all No exemplo acima, só as maquinas da rede 192.168.0.0/255.255.225 de 09:00 as 18:00 poderão acessar a Internet, as demais maquinas ou qualquer maquina fora deste horário não poderão acessar. Inicializando o Squid O rpm colocara o script de inicialização no /etc/rc.d/init.d/squid, mas se instalado via tgz precisaremos criar uma entrada para que ele inicie. Podemos utilizar o rc.local para isso, adicionando a seguinte linha: /usr/bin/squid o comando squid tem uma série de parâmetros, veja alguns interessantes. squid -k {reconfigure|rotate|shutdown|interrupt|kill|debug|check} reconfigure:Faz com que o squid releia os arquivos de configuração rotate: Faz com que o squid de o "rotate log" shutdown: Derruba o squid de uma maneira graciosa, espera as conexões fecharem interrupt: Derruba o squid sem esperar o fim das conexões kill: Derruba o squid sem esperar as conexões fecharem nem os logs, só usar em ultimo caso debug: Ordena o squid a gerar log de depuração máximo ate que seja enviado de novo check: Verifica se existe uma cópia do squid em execussão. Configuração dos Clientes Para que os clientes possam acessar o squid temos 3 opções; configurar o browser manualmente na porta escolhida, montar um script de auto configuração e configurar o browser para usa-lo, configurar o servidor como proxy transparente. A complexidade de cada uma vai depender do numero de estações e tipos de configurações desejadas. Parâmetros definidos para nosso servidor Nome :proxy.pcplace.com.br Porta de proxy :8080 IP Invalido :192.168.0.10 IP Valido :200.200.200.10 (espero que não esteja privilegiando ninguém : ) Domínio :pcplace.com.br Domínios locais :linuxplace.com.br (Não usar proxy):serverplace.com.br Opção 1 Mão na massa, ou melhor no navegador. Netscape: Vá ao menu Editar/Preferências, de dois cliques em avançado e selecione proxy. Marque a opção "Configuração manual do Proxy" e clique no botão ao lado, IE lynx O lynx funciona por variáveis de ambiente, você pode acrescentar a seguinte linha ao seu ~/.bashrc: export "http_proxy=http://proxy.pcplace.com.br.com.br:8080/" A variável funciona com o seguinte formato "protocolo_proxy" Então, se quiser proxy para ftp, troque o http_proxy para ftp_proxy. Se quisermos que esta variável funcione para todos os usuários da maquina edite o /etc/lynx.conf (ou onde esteja o arquivo de configuração do lynx) e acrescente a linha http_proxy:http://proxy.pcplace.com.br.com.br:8080/ Opção 2: Criar um arquivo de configuração automático, fiz este aqui baseado no que esta disponível na pagina do squid, só alterar segundo as necessidades. Se alguém quiser algo mais avançado pode consultar na pagina http://developer.netscape.com/docs/manuals/proxy/ProxyNT/AUTOCONF.HTM Depois de editado o arquivo, ele deve ser publicado em algum servidor Web disponível para os computadores que serão configurados por ele, não podemos publicar num servidor que só será acessível através do proxy. Vamos supor que ele fique no seguinte endereço: http://www.servidorlocal.com.br/proxy.pac O servidor web ainda tem de informar o mime type correto do pac, trocando em miúdos adicione a seguinte linha no httpd.conf do apache. AddType application/x-ns-proxy-autoconfig .pac [Arquivo proxy.pac] Netscape Vá ao menu Editar/Preferências, de dois cliques em avançado e selecione proxy. Marque a opção "Configuração automática do proxy" digite no campo ao lado. http://proxy.pcplace.com.br/proxy.pac IE Opção 3 OK, sem configurar browser, vamos engana-los :) O proxy transparente é uma união de uma característica do squid mais o ipforward do Linux. Para que isso funcione o linux em questão tem de estar configurado para ser o gateway das maquinas. Vamos interceptar as conexões Web e redirecioná-las para o Squid. Na parte do linux precisamos de um kernel com IPFirewalling e Suporte a Proxy transparente, maiores detalhes IPCHAINS-HOWTO e Firewall-HOWTO disponíveis no ldp.conectiva.com.br. Configurações necessárias para o kernel 2.2; [*] Network firewalls [ ] Socket Filtering [*] Unix domain sockets [*] TCP/IP networking [ ] IP: multicasting [ ] IP: advanced router [ ] IP: kernel level autoconfiguration [*] IP: firewalling [ ] IP: firewall packet netlink device [*] IP: always defragment (required for masquerading) [*] IP: transparent proxy support O seguintes comandos tem de ser executados, sugiro que sejam adicionados ao rc.local (/etc/rc.d/rc.local no conectiva)] /sbin/ipchains -A input -p tcp -s 192.168.0.0/24 -d 0/0 80 -j REDIRECT 8080 (ou a porta que esteja sendo utilizada pelo squid) echo 1 > /proc/sys/net/ipv4/ip_forward Isso vai redirecionar tudo o que vier para a porta 80 (http) para a porta local 8080 do squid. Bom, isso e só a primeira parte, agora temos de configurar o Squid. Mais linhas adicionadas ao squid.conf: httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on O modo do httpd-accelerator permite ao squid responder como se fosse um servidor Web real, e redirecionar a chamada para o servidor real. Bom, os clientes não passam tão liso assim de configuração, eles devem ver o squid como seu gateway primário, ou pelo menos o gateway primário deles deve ver o squid como o gateway para porta 80, essa configuração depende de cada rede. Bem espero que isso possa começar a dar uma luz no fascinante SQUID. Proximo DICA : Como saber o que os seus usuarios estao vendo $ cat /var/log/squid/access.log| grep playboy Ou vejo o q foi negado durante o dia: $ cat /var/log/squid/access.log| grep DENIED Ponho no cron p/ me mandar email. Todo dia as 23:20 executa "dormir" um script: $ crontab -e 20 23 * * * /root/bin/dormir Script domir #/bin/sh cat /var/log/squid/access.log| grep DENIED | tail -n 60 |mail root Pedaço do Squid configurado Divirtão - se #quem aparece como o culpado nas páginas de erro? # nao testei, mas acho q pode ser uma URL, ai o cara pode ler sobre as regras e tal cache_mgr mask@localhost #Log igual do apache? # cheguei a usar, mas calamaris (analizador de logs http://Cord.de/tools/squid/calamaris/ )nao aceita. #Use o formato do squid, é melhor. # se precisa do formato antigo use o shrimp.pl da pagina do calamaris. #emulate_httpd_log on # qual endereco/porta ouvir? Este é o endereco q vc deve por nos clientes # o padrao é 3128 mas eu nao queria mudar 100 maquinas, q ja usavam porta 80 http_port 192.168.1.1:80 #tamanho do cache cache_dir ufs /var/spool/squid 100 16 256 #qual programa vai procurar nomes no DNS (/etc/resolv.conf)? cache_dns_program /usr/bin/dnsserver #Quantos processos p/ procurar nomes? dns_children 5 #??? ver no FAQ refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 # ACL's Padroes: acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 # Fora essas portas , nao conecta. 22 por ex. acl SSL_ports port 443 563 acl Safe_ports port 80 21 443 563 70 210 1025-65535 acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT # configuracao padrao. So conecta de localhost (ver FAQ) http_access allow manager localhost http_access deny manager # Negue tudo q nao estiver em Safe_ports( O ! quer dizer inverta) http_access deny !Safe_ports http_access deny CONNECT !SSL_ports #---------------------------------------------------SUAS PROPRIAS REGRAS! #Atencao: qto mais regra, mais lento o squid. Use o bom senso. #Avise os clientes do q vai ser proibido. #Grupo q esta por cima da carne seca... # informatica.txt contem os IP, um por linha, q nao estao sujeitos a todos os cortes: # 192.168.1.2 # chefe.minhanet # Sacou? acl informatica src "/etc/squid/data/informatica.txt" #Pobres mortais #povao.txt IP dos q tem acesso, mas restritos as regras definidas pelas acl abaixo acl povo src "/etc/squid/data/povao.txt" #Playboy, chat, micros~1 #dominios q nao podem ser acessados, um por linha # www.playboy.com.br # www.microsoft.com # www.hotmail.com acl dominios-proibidos dstdomain "/etc/squid/data/dominios-proibidos.txt" #corta qqer url q contem "sex" #Nao uso pois corta seXta.gif ou Sexta.html por exemplo #acl badURL url_regex -i sex #corta qqer URL q termine com .zip .mp3 .exe . #Opcao -i: Ignora caixa. Corta Mp3 ou MP3 ou mP3 por exemplo. # tentei colocar tudo numa linha só mas nao foi :-( acl mp3 url_regex -i .*\.mp3$ acl zip url_regex -i .*\.zip$ acl exe url_regex -i .*\.exe$ #livra a gente logo de cara :) sem passar por outras regras http_access allow informatica http_access deny dominios-proibidos #http_access deny badURL http_access deny mp3 http_access deny zip http_access deny exe #se é do povao e nao foi pego pelas regras acima , entao libera... http_access allow povo http_access allow localhost #Nega todo o resto http_access deny all miss_access allow all