segunda-feira, 20 de maio de 2013


Proxy, do inglês, significa literalmente: procuração. Ou seja, o proxy trabalha por procuração e refere-se a um software que atua como gateway de aplicação entre o cliente e o serviço a ser acessado.

Ele trabalha como uma espécie de pequeno canal interpretando as requisições e tratando-as como se fosse uma aplicação e repassando-as ao servidor de destino, como se fosse um novo pedido de requisição.

Enquanto o IPtables (que é um filtro de pacotes, pois o conceito de firewall é bem mais amplo e envolve uma série de servidores) analisa individualmente os pacotes, à medida em que são transmitidos da Camada de Enlace (camada 2 do modelo ISO/OSI) para a Camada de Rede (camada 3 do modelo ISO/OSI), o Squid analisa as requisições, pacotes e tráfego na camada 7 (Camada de Aplicação do modelo ISO/OSI), porém, ambos baseiam-se, fundamentalmente, nas informações do cabeçalho dos protocolos da camada de transporte (camada 4).

A camada 7 é onde atuam as aplicações, sendo que os navegadores (browsers) são aplicações e é nos navegadores onde o Squid mais atua.

O Squid é um servidor proxy (ou webproxy e pode ser considerado como um servidor pertencente a um firewall) que suporta diversos protocolos, inclusive os da pilha TCP/IP (HTTP, HTTPS, FTP etc).

Ele melhora os tempos de resposta, fazendo cache de requisições frequentes de páginas Web numa rede de computadores. Pode ser usado para controle de banda, restrição de sites, usuários, entre outros serviços.

O gateway de aplicação (o popular proxy), ao receber as requisições de acesso dos usuários e realizar uma segunda conexão externa para receber estes dados, acaba por esconder a identidade dos usuários nas requisições externas, oferecendo uma proteção adicional contra a ações maldosas.

Para segurança maior, é altamente recomendável ter um filtro de pacotes e um servidor proxy protegendo a rede, no caso, IPtables e Squid.

Além de webproxy, o Squid fornece o serviço de cache. Cache significa a capacidade de um sistema de armazenar em memória (ou em áreas reservadas do disco rígido), o conteúdo mais frequentemente acessado com o objetivo de disponibilizá-lo de forma mais rápida e eficiente a quem o solicita.

Conceito de swapping


É uma técnica de troca de processos. Todo sistema operacional armazena, em uma fila em disco, os processos de longo prazo. Quando há espaço na memória principal (RAM, por exemplo) os processos são movidos para ela para serem executados e retirados quando forem concluídos. Ou seja, quando você abre um aplicativo, um editor de texto, por exemplo, o sistema operacional aloca um espaço na memória RAM para executá-lo.

Se não há espaço na memória RAM, o sistema utiliza a SWAP (memória virtual - espaço em disco utilizado como memória RAM) e isso torna o sistema lento, pois o acesso do processador ao disco rígido é muito mais lento do que à memória RAM.

No Windows, a SWASP é chamada de "arquivo de paginação". Quando você fecha o aplicativo, o sistema desaloca esse espaço da memória (RAM ou swap).

A memória RAM é extremamente importante para a utilização de um cache proxy. O Squid mantém uma tabela na memória RAM onde guarda as informações sobre seus objetos.

Se uma parte dessa tabela sofrer swapping, o desempenho do Squid será bastante prejudicado. Como o Squid é um processo, então qualquer swapping tornará o programa mais lento. E como o sistema está constantemente fazendo swapping, é importante saber gerenciar o "cache_dir" e o "cache_mem" do Squid.


Desempenho do Squid


Em relação ao desempenho do Squid, alguns tipos de ACL requerem a suspensão da solicitação atual para acessar uma fonte de dados externa.

Alguns tipos de ACLs exigem informações que podem não estar mais disponíveis para o Squid, e isso requer suspensão do trabalho na atual solicitação, tendo que consultar alguma fonte externa e retomar o trabalho quando a informação estiver disponível.

Este é, por exemplo, o caso do DNS, dos autenticadores e dos scripts de autorização externa. As ACLs podem, assim, ser divididas em ACLs rápidas [fast] que não necessitam ir às fontes externas e ACLs lentas [slow].

Conhecer o comportamento das ACLs é relevante, porque nem todas as diretivas suportam todos os tipos de ACLs. Se uma ACL do tipo SLOW tem que ser verificada e os resultados da seleção não estão no cache, essa ACL não será correspondida.

O Squid armazena os resultados de pesquisas das ACLs sempre que possível, porém, as ACLs lentas nem sempre precisam consultar fontes de dados externas. Em outras palavras, as ACLs do tipo SLOW não são confiáveis em todas as cláusulas de verificação de acesso.

As ACLs rápidas estão marcadas com [fast] no "squid.conf" e as ACLs lentas estão marcadas com [slow]. As ACL marcadas com {R} são ACLs de resposta.

As listas abaixo podem estar incompletas. Para ter a lista completa do tipo de ACL da sua versão do Squid, consulte o arquivo "squid.conf.documented".

À propósito, o "squid.conf", além de quilométrico, é de uma confusão sem tamanho. Se foi apenas um sujeito que elaborou aquilo ali, esse cara deve ter algum distúrbio mental.

Lista de ACLs rápidas (Squid 3):
all (built-in)
src
dstdomain
dstdom_regex
myip
arp
src_as
peername
time
url_regex
urlpath_regex
port
myport
myportname
proto
method
http_status {R}
browser
referer_regex
snmp_community
maxconn
max_user_ip
req_mime_type
req_header
rep_mime_type {R}
user_cert
ca_cert


Lista de ACLs lentas:
dst
dst_as
srcdomain
srcdom_regex
ident
ident_regex
proxy_auth
proxy_auth_regex
external
ext_user
ext_user_regex


Cláusulas de acesso rápido:
icp_access
htcp_access
htcp_clr_access
miss_access
ident_lookup_access
reply_body_max_size {R}
authenticate_ip_shortcircuit_access
log_access
header_access
delay_access
snmp_access
cache_peer_access
ssl_bump
sslproxy_cert_error
follow_x_forwarded_for


Cláusulas de acesso lento:
http_access
adapted_http_access (2.x call this http_access2)
http_reply_access
url_rewrite_access
storeurl_access
location_rewrite_access
always_direct
never_direct
cache

Cálculo do cache_dir e do cache_mem

O "cache_mem" do Squid, especifica a quantidade ideal de memória a ser usada para:

# * In-Transit objects (Objetos em trânsito)
# * Hot Objects (Objetos Hot)
# * Negative-Cached objects (Objetos em cache negativo)

Os objetos em trânsito são objetos que estão sendo buscados em servidores remotos, enquanto "objetos quentes" são objetos que o Squid decidiu que são populares o suficiente para que uma cópia seja mantida na memória, para acelerar o acesso (objetos constantemente solicitados).

E objetos em cache negativo, significam objetos não-cacheáveis, como por exemplo, logs de mensagens de status HTTP. O cache negativo evita a repetição de consultas adicionais para objetos que não mais existem.

Os objetos que têm trânsito, têm prioridade, ou seja, quando exceder o limite da memória, o Squid liberará o espaço dos Hot Objects e dos Negative-cached Objects para guardar os objetos em Trânsito. Todos os objetos são armazenados na memória em blocos de 4 KB.


Cálculo do cache_dir e do cache_mem

A tabela do Squid na memória RAM funciona como um índice. Pense no índice de objetos do Squid como se fosse o índice de páginas de um livro. Quanto maior o livro, maior o índice e, logicamente, mais tempo se levará na busca de uma página específica.

Quanto mais objetos o Squid tem armazenado no disco rígido, mais espaço de memória RAM ele alocará. Porém, isto não significa que você deve esvaziar o cache do Squid com frequência.

O ideal é calcular bem o "cache_dir" e o "cache_mem" para somente ter que limpar o cache do Squid em caso de problemas, pois quando o "cache_dir" lota, o Squid automaticamente apaga os objetos mais antigos e grava os mais novos.

Uma pequena quantidade de metadados para cada objeto em cache é mantida na memória. Esta estrutura de dados é conhecida como StoreEntry. São 56 bytes em arquiteturas de 32 bits e 88 bytes em arquiteturas de 64 bits.

Além disso, existe um cache de 16 bytes (MD5) associado a cada StoreEntry. Isto significa que existem 72 ou 104 bytes de metadados na memória para cada objeto no cache. Um cache com 1.000.000 de objetos, portanto, requer 72 MB de memória apenas para os metadados.

O Squid utiliza 10 MB de memória RAM para cada 1 GB no disco em sistemas de 32 bits e 14 MB de memória RAM para cada 1 GB em sistemas de 64 bits. A FAQ do Squid aconselha utilizar um terço da memória total da máquina somado às regras anteriores.

Cálculo do "cache_mem" total utilizando 5 GB como exemplo e tomando-se, por exemplo, 3 gigabytes como total da memória RAM da máquina:

Para sistemas de 32 bits:
10 x 5 = 50 MB
1/3 de 3 GB = 1 GB (1024 MB)
1024 + 50 = 1074 MB


Para sistemas de 64 bits:
14 x 5 = 70 MB
1024 + 70 = 1094 MB


* Lembre que os 5 GB acima utilizados no cálculo, não se referem à quantidade colocada no "cache_dir" e sim à quantidade que o Squid TEM armazenado dentro do espaço total destinado ao "cache_dir".

A coisa toda se processa assim: você pode colocar 500 mil GB de "cache_dir" (se tiver um HD desse tamanho), mas o Squid irá aumentando o índice de acordo com o que for armazenando no disco e, consequentemente, ocupará mais espaço na memória RAM. Quando ele "encher" os 500 mil GB, ele mesmo excluirá os objetos mais antigos do cache.

O confuso "squid.conf" nos diz que para o "cache_dir" é uma boa prática utilizar o espaço total da partição destinada para o cache_dir menos 20%.

Para o cálculo efetivo do "cache_dir" e do "cache_mem", é importante analisar a quantidade de tráfego da sua rede. Basicamente, quanto maior a rede (número de computadores), maior o tráfego.

Um adendo deve ser feito agora em caso de se utilizar cache de vídeos: deve ter-se um HD de tamanho generoso e deve-se aumentar o maximum_object_size para um tamanho ideal.

Donde conclui-se: o tamanho do "cache_dir" é proporcional ao tamanho do "cache_mem". Quanto mais aumenta o espaço utilizado no "cache_dir" mais aumenta o espaço utilizado no "cache_mem".
Resumindo

As quantidades colocadas no "cache_dir" e no "cache_mem", são quantidades totais que irão sendo preenchidas de acordo com o uso do Squid. Você deve ir "jogando" com o "cache_dir" e com o "cache_mem" se acontecerem problemas de lentidão ou travamento, e deve verificar se as ACLs (fast ou slow) não estão causando essa lentidão ou travamento.

A escolha do tamanho ideal para o "cache_dir" e para o "cache_mem" deve levar em conta o tráfego dentro da rede. Mas lembre-se, colocar muito "cache_dir" e pouco "cache_mem" poderá tornar o Squid lento e, por conseguinte, o sistema operacional.

E colocar pouco "cache_dir" e muito "cache_mem", representa um desperdício de memória e poderá faltar memória para o sistema operacional e/ou para os outros serviços instalados na máquina, pois o Squid reserva o espaço do "cache_mem" e poderá causar, de novo, lentidão ou travamento.

Eu, pessoalmente, acredito que utilizar um "cache_dir" de 5 GB (cinco gigabytes) é o ideal, quando não se fizer cache de vídeos. Lembre-se da analogia do índice do Squid: quanto mais páginas no livro, maior o índice e, consequentemente, mais tempo o Squid leva na busca dentro do cache.

Porém, polêmicas à parte, torno a repetir, isso depende da quantidade de tráfego que você tem na sua rede e da configuração de hardware que você tem disponível.

Uma configuração ideal de máquina (opinião minha) é colocar o sistema operacional com IPtables, Squid (com Sarg) e DHCP com compartilhamento.

Lógico que aí está incluída a escolha do tamanho do HD, do processador, da quantidade de memória RAM, da placa-mãe etc; e da disponibilidade financeira para se montar o hardware. Essa configuração fica melhor até para gerenciamento do servidor.

Se você utilizar o Squid com Windows (Squid-NT ou WinSquid), deve colocar uma boa quantidade de memória RAM, pois o sistema operacional Windows, além de consumir muita memória RAM, não tem um bom gerenciamento dela.


Configurações mínimas recomendadas com comentários

A seguir, a configuração mínima recomendada, com comentários, para o Squid tirada do "squid.conf" original.

Essa configuração mínima refere-se ao Squid 3 versão 3.3.3, mas serve para versões anteriores, com algumas poucas adaptações.

#
# Configuração mínima recomendada:
#

# Exemplo de regras permitindo o acesso às redes locais.
# Adapte a lista abaixo às suas redes (internas) onde a navegação
# deve ser permitida:
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
#
acl SSL_ports port 443 # https
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais z39.50
acl Safe_ports port 1025-65535 # unregistered ports
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
#
# Configuração mínima recomendada para permissões de acesso:
#
# Permite que somente localhost acesse o cachemgr:
http_access allow localhost manager
http_access deny manager

# Nega requisições de certas portas inseguras:
http_access deny !Safe_ports

# Nega conexão a outras portas que não sejam SSL seguras:
http_access deny CONNECT !SSL_ports

# Nega acesso dos usuários locais às aplicações web
# rodando no servidor proxy.
http_access deny to_localhost

#
# INSIRA NESTE LOCAL SUAS PRÓPRIAS REGRAS.
# RECOMENDA-SE PRIMEIRO FAZER AS LIBERAÇÕES E DEPOIS OS BLOQUEIOS.
#

# Exemplo de regra permitindo o acesso de suas redes locais.
# Adapte "localnet" na seção ACL para listar as suas redes
# (internas) de IP a partir de onde se deve permitir a navegação
http_access allow localnet
http_access allow localhost

# E, finalmente, negue qualquer outro acesso a este proxy
http_access deny all

# O Squid normalmente escuta na porta 3128
# Para proxy transparente coloque "intercept" depois de 3128
# http_port 3128
http_port 3128 intercept
#
# Especifica a quantidade ideal de memória a ser utilizada. Cuide
# para que não falte memória para o sistema operacional e para os
# outros serviços instalados na máquina.
# Default:
cache_mem 256 MB
#
# Objetos maiores que este tamanho não serão mantidos no cache de
# memória. Deve ter um valor suficiente para guardar objetos
# acessados com frequência na memória de modo a melhorar o
# desempenho, mas suficientemente baixo para manter
# objetos maiores.
#Default:
maximum_object_size_in_memory 512 KB
#
# Diretório de cache. É o número em MB de quanto seu Squid pode
# usar do disco. Sempre que o Squid atingir esse valor ele mesmo
# excluirá os objetos mais antigos do cache.
cache_dir aufs /etc/squid3/var/cache/squid 5120 16 256
#
# heap GDSF : Greedy-Dual Size Frequency
# Otimiza o HIT Ratio de objetos mantendo os arquivos menores e
# populares no cache e obtém uma melhor chance de acontecer um
# HIT. HIT significa que o documento foi encontrado no cache.
# MISS, que não foi encontrado no cache. Um Hit negativo significa
# que foi encontrado no cache, mas não existe.
cache_replacement_policy heap LFUDA
#
# heap LFUDA: Least Frequently Used with Dynamic Aging
# Procura manter no cache arquivos populares, independente do
# tamanho, otimizando assim o Byte HIT em detrimento do HIT.
memory_replacement_policy heap GDSF
#
# Objetos menores do que esse tamanho não serão salvos em disco. O
# valor é especificado em kilobytes, e o padrão é 0 KB, o que
# significa que não existe mínimo.
#Default:
minimum_object_size 0 KB
#
# Limite do tamanho dos objetos armazenados no disco.
# Este tamanho é usado pelo cache_dir. O valor é especificado em
# bytes. Se você deseja obter uma alta taxa de acerto em BYTES,
# você deve aumentar este valor. Se você quiser aumentar a taxa de
# acerto mais do que poupar largura de banda você deve deixar este
# valor baixo.
# NOTA: se estiver usando a política de substituição LFUDA você
# deve aumentar este valor para maximizar a taxa de acerto do byte
# hit LFUDA!
#Default:
maximum_object_size 4 MB
#
# Os padrões são 90% e 95%. Se você tem um grande cache, 5% pode
# representar centenas de MB. Se este for o caso, você pode querer
# definir números mais próximos.
#Default:
cache_swap_low 90
#Default:
cache_swap_high 95
# Arquivos de log das requisições dos clientes.
#Default:
access_log daemon:/etc/squid3/var/logs/access.log squid
#Default:
cache_log /etc/squid3/var/logs/cache.log
#
# Por padrão o Squid deixa os arquivos principais no diretório de
# onde foi iniciado. Deixe coredump no primeiro diretório de
# cache.
coredump_dir /etc/squid3/var/cache/squid

# Adicione qualquer uma das suas próprias entradas refresh_pattern
# acima destas:
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
#
# Coloque aqui o e-mail do administrador.
# É para este endereço que os e-mails serão enviados quando o
# cache morrer.
#Default:
# cache_mgr webmaster
#Default:
httpd_suppress_version_string off # suprime a versão do Squid
visible_hostname nome # Cria um nome para o Squid.
#
# Diretório que contém as páginas de erros personalizadas que
# serão mostradas na página que aparece quando há um bloqueio.
# Você deve criar o diretório e indicar o caminho. Se esta
# opção for usada irá desabilitar o suporte multi-língua
# das páginas de erro.
#error_directory /usr/share/squid3/errors/arquivo



Referências:
SquidFaq/SquidMemory - Squid Web Proxy Wiki
SquidFaq/SquidAcl - Squid Web Proxy Wiki
squid.conf
​Créditos: Buckminster(VOL)



Categories: , ,

0 comentários:

Postar um comentário

Subscribe to RSS Feed Follow me on Twitter!