FreeBSD
Proxy e Cache HTTP
Squid
O Squid é um software largamente utilizado como servidor proxy e cache
HTTP em diversos tipos de redes, como corporativas, de provedores, universidades
etc. Possui alta performance e suporta os protocolos HTTP, FTP e Gopher. A sua
página é www.squid-cache.org.
De um modo simplificado, o Squid recebe os pedidos de usuários que desejam
visualizar páginas externas e verifica se tem a página em cache.
Se tiver a página em cache, verifica se ela ainda é válida
e envia para o cliente. Se não tiver a página em cache, busca
a página no servidor externo, armazena no cache e manda para o cliente.
Assim, na próxima vez que alguém solicitar esta página
a mesma será carregada muito mais rapidamente, pois estará em
um cache local. Entre as principais vantagens de utilizar o Squid estão:
· Aumento na segurança, pois todas as requisições
para páginas externas irão passar através do proxy;
· Aumento da velocidade de navegação e/ou diminuição
da utilização do link Internet, já que muitas páginas
acessadas pelos usuários estarão em cache local;
· Possibilidade de definir uma política de acesso, bloqueando
páginas fora do escopo a que se destina a Internet na instituição,
como chat, pornografia etc.
O Squid necessita de um diretório no disco onde irá armazenar
o seu cache. Geralmente, em máquinas com esse propósito criamos
um filesystem especial para o Squid, que pode ser /squid, onde serão
guardados o cache e os logs. O tamanho do cache pode ser determinado pela configuração
do Squid, e quanto maior o cache mais páginas serão armazenadas
e mais rápida será a navegação.
Efetue o download da última versão estável do Squid, a partir do seu site. A versão atual é 2.5 STABLE4, e o arquivo se encontra em http://www.squid-cache.org/Versions/v2/2.5/squid-2.5.STABLE4.tar.gz. Extraia este arquivo no /tmp, e vá até o diretório que será criado.
Execute os seguintes comandos:
# ./configure --prefix="/usr/local"
--sysconfdir="/usr/local/etc/squid" --localstatedir="/var"
--enable-storeio="ufs diskd" --enable-removal-policies="lru heap"
--enable-default-err-language="Portuguese" --disable-hostname-checks
# make
# make install
O executável do Squid será instalado em /usr/local/sbin/squid.
O arquivo de configuração será /usr/local/etc/squid/squid.conf.
Deve ainda ser removido o diretório /var/logs (iremos utilizar outro
diretório para os logs do Squid):
# rmdir /var/logs
Crie um usuário e um grupo de nome squid:
# pw group add squid -g 180
# pw user add squid -c "Squid" -d "/nonexistent" -s "/sbin/nologin"
-u 180 -g 180
Crie o diretório /var/log/squid, para armazenar os logs do Squid. Atribua a este diretório o dono squid e aplique a permissão 750.
Vá até o diretório /usr/local/etc. Visualize o arquivo squid.conf.default e veja todas as opções. Segue abaixo um exemplo sintetizado do arquivo squid.conf. Copie-o no diretório mencionado. Mantenha o squid.conf.default como referência.
-------------------- Arquivo squid.conf --------------------
# squid.conf
# Define em qual ip e porta
o Squid devera aguardar requisicoes.
# Pode ser definido o IP interno, no caso de uma maquina com
# mais de uma interface. Tambem pode ser especificada apenas a
# porta. O padrao eh ouvir todas as interfaces na porta 3128.
#http_port 10.10.0.5:3128
# O parametro no_cache define
que determinados objetos não deverão
# ser armazenados em cache. Eh preciso primeiro definir uma acl
# indicando quais os objetos. Em seguida aplica-se o no_cache a
# esta acl.
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# O parametro cache_mem nao
especifica o tamanho maximo do processo
# do Squid, que ira ultrapassar este valor. O cache_mem se destina a
# especificar o espaco em memoria destinado aos objetos em transito e
# outros importantes. A prioridade eh dos objetos em transito, e
# apenas o espaco restante sera ocupado pelos outros (Hot Objects e
# Negative-Cached Objects). Se o espaco necessario para os objetos
# em transito for maior que cache_mem sera alocada mais memoria,
# ou seja, cache_mem nao especifica um limite de memoria. O padrao
# eh 8 MB.
#cache_mem 8 MB
# Tamanho maximo dos objectos
armazenados no cache no disco.
# O padrao eh 4096 KB.
#maximum_object_size 4096 KB
# Tamanho minimo dos objetos
armazenados no cache no disco.
# O padrao eh 0, sem limite.
#minimum_object_size 0 KB
# Tamanho maximo dos objetos
mantidos em memoria.
# O padrao eh 8 KB.
#maximum_object_size_in_memory 8 KB
# O parametro cache_replacement_policy
determina qual a politica
# de substituicao dos objetos quando se esgota o espaco destinado
# ao cache em disco.
# lru: mantem os objetos referenciados recentemente.
# heap GDSF: otimiza o "hit rate" por manter objetos pequenos e
# e populares no cache, guardando assim um numero maior de objetos.
# heap LFUDA: otimiza o "byte hit rate" por manter objetos populares
# no cache sem levar em conta o tamanho. Se for utilizado este, o
# maximum_object_size devera ser aumentado para otimizar o LFUDA.
cache_replacement_policy heap GDSF
# O memory_replacement_policy
define a politica de substituicao dos
# objetos em memoria, da mesma forma como o cache_replacement_policy.
# Os valores possiveis são os mesmos. O padrao eh lru.
#memory_replacement_policy lru
# O cache_dir define qual
o diretorio e qual o espaco
# utilizado para o cache no disco. Podem ser definidos
# varios diretorios se necessario. O tamanho (em MB) nao deve
# ser o tamanho total da particao, descontar no minimo
# 20%.
# cache_dir diskd Diretorio Tamanho 16 256 Q1=72 Q2=64
cache_dir diskd /squid 1000 16 256 Q1=72 Q2=64
# Log de requisicoes.
cache_access_log /var/log/squid/access.log
# Log do cache.
cache_log /var/log/squid/cache.log
# Log de objetos guardados.
Pode ser desativado.
cache_store_log none
# Arquivo com o PID.
pid_filename /var/log/squid/squid.pid
# Tempo de espera para resolver
conexoes pendentes antes de
# efetuar o shutdown do Squid. O padrao eh 30 seconds.
shutdown_lifetime 10 seconds
# ACLs gerais.
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 to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563 10000
acl Safe_ports port 80 21 443 563 70 210 1025-65535 280 488 591 777
acl CONNECT method CONNECT
# ACL que define os clientes
permitidos. Especificar as redes que
# irao utilizar o cache.
acl clientes src 10.10.0.0/16 10.20.0.0/16
# ACLs para paginas proibidas.
Os arquivos especificados conterao
# as ACLs, para facilitar a edicao.
acl proibido-url url_regex -i "/usr/local/etc/squid/proibido-url"
acl proibido-urlpath urlpath_regex -i "/usr/local/etc/squid/proibido-urlpath"
acl proibido-dominios dstdom_regex -i "/usr/local/etc/squid/proibido-dominios"
# Permitir ou negar o acesso
baseado nas acls.
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny proibido-url
http_access deny proibido-urlpath
http_access deny proibido-dominios
http_access allow clientes
http_access deny all
# Usuario sob o qual ira rodar
o Squid.
cache_effective_user squid
# Grupo sob o qual ira rodar
o Squid.
cache_effective_group squid
# Hostname completo.
visible_hostname squid.exemplo.org
# Opcoes para suportar proxy
transparente.
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
# Numero de arquivos de log
rotacionados a guardar.
logfile_rotate 4
# O parametro always_direct
permite definir que as requisicoes
# preenchendo as exigencias de determinada ACL serao sempre
# encaminhadas direto ao servidor requisitado. Exemplo:
#acl servidores-locais dstdomain dominiolocal.org
#always_direct allow servidores-locais
# Evita que sejam feitos coredumps.
coredump_dir none
-------------------- Fim do arquivo squid.conf --------------------
O diretório no qual o Squid irá guardar o cache deverá ter o dono squid e permissão 750.
Como estaremos utilizando o diskd, é interessante fazer um certo tuning, adicionando algumas opções no kernel. Adicione as opções abaixo, e após isso recompile e instale o novo kernel, e reinicie a máquina.
# Suporte a memoria compartilhada.
options SYSVSHM
# Maximo de segmentos de memoria
compartilhada por processo.
options SHMSEG=16
# Numero maximo de identificadores
de memoria compartilhada.
options SHMMNI=32
# Tamanho maximo de segmento
de memoria compartilhada.
options SHMMAX=2097152
# Numero maximo de paginas
de memoria compartilhada.
options SHMALL=4096
# Suporte a filas de mensagens.
options SYSVMSG
# Numero maximo de bytes por
fila de mensagem.
options MSGMNB=16384
# Numero maximo de identificadores
de filas de mensagens.
options MSGMNI=41
# Numero maximo de segmentos
de mensagem no sistema.
options MSGSEG=2049
# Tamanho de um segmento de
mensagem.
options MSGSSZ=64
# Numero maximo de mensagens
no sistema.
options MSGTQL=2049
Após ter configurado, execute o Squid pela primeira vez com a opção
"-z":
# /usr/local/sbin/squid -z
Isto irá criar a estrutura de diretórios que irá suportar o cache.
Para efetuar o serviço de proxy transparente, este servidor deverá encaminhar para a porta do Squid as requisições HTTP vindas dos clientes, da rede interna por exemplo. Para isso, você deverá ter um firewall configurado e funcionando, veja a seção IPFW2. Coloque a seguinte regra no ipfw2:
add 800 fwd 127.0.0.1,3128
dst-port { 80 or 21 } src-ip 10.10.0.0/16
add 810 allow dst-port 3128 dst-ip 10.10.0.5 src-ip 10.10.0.0/16
add 900 deny dst-port 3128
A rede 10.10.0.0/16 no exemplo é a rede interna, cujas requisições
nas portas 80 e 21 serão direcionadas para a porta 3128 em localhost.
Também será permitido que máquinas da rede local contatem
o Squid, caso o proxy seja configurado manualmente. O ip 10.10.0.5 no exemplo
é o da interface do servidor conectada a rede interna. A terceira regra
irá bloquear qualquer outro tráfego tendo como destino a porta
3128. Estas regras devem ficar antes da(s) regra(s) do NAT, caso esteja utilizando-o.
Vá até o diretório /usr/local/etc/squid. Poderão
ser criados os arquivos proibido-url, proibido-urlpath e proibido-dominios,
todos com o dono squid. Estes arquivos deverão possuir a relação
de páginas cujo acesso não será permitido. Deverão
ter uma entrada por linha, e descritas em expressões regulares - na maioria
das vezes não são necessárias espressões muito elaboradas,
bastando inserir as strings, uma por linha. O arquivo proibido-url deve conter
as strings que serão verificadas contra toda a URL. O proibido-urlpath,
as strings que serão verificadas contra a URL completa menos o nome do
servidor e domínio, por exemplo no endereço www.exemplo.org/testes/pagina,
o urlpath é apenas "testes/pagina". Já o proibido-dominios
é o contrário, contém as strings que serão verificadas
apenas contra o nome e domínio do site, no exemplo anterior seria "www.exemplo.org".
Um excelente guia sobre expressões regulares se encontra no endereço
http://aurelio.net/er/.
Para que os logs do Squid sejam rotacionados na freqüência desejada,
insira uma linha no arquivo /etc/crontab que execute o comando "squid -k
rotate". O exemplo abaixo faz com que a rotação seja feita
todo sábado às 23h58min:
58 23 * * 6 root /usr/local/sbin/squid -k rotate
Crie um script de inicialização para o Squid, em /usr/local/etc/rc.d/squid.sh. Os comandos de inicialização e shutdown deverão ser, respectivamente:
/usr/local/sbin/squid
e
/usr/local/sbin/squid -k shutdown
Atualizado em 03/02/04.
Heini Thomas Geib.
http://infsr.unijui.tche.br/~heini