Arquivo

Archive for outubro \18\America/Sao_Paulo 2009

Squid – Proxy Server


Servidor Proxy (Squid)

 

Um servidor proxy é uma peça importante em uma rede interna que tenha contato com outra pública, pois implementa uma série de facilidades e controles. Veremos, definitivamente, tudo sobre ele.

Ao final deste artigo você será capaz de:

  • Instalar e configurar o servidor proxy (squid)
  • Configurar o squid para atuar como proxy transparente.

Conceitos de Servidores Proxy

O objetivo principal de um servidor proxy é possibilitar que máquinas de uma rede privada possam acessar uma rede pública, como a Internet, sem que para isto tenham uma ligação direta com esta. O Servidor proxy costuma ser instalado em uma máquina que tenha acesso direto à internet, sendo que as demais efetuam as solicitações através desta. Justamente por isto, este tipo é chamado de Proxy, pois é um procurador, ou seja, sistema que faz solicitações em nome de outros.

Considerações Iniciais

  • Utilizaremos duas ferramentas de instalações.
  • A primeira é a urpmi utilizada em algumas distribuições como a Mandriva e etc.
  • A Segunda é o APT-GET utilizado em outras distribuições como Ubuntu e etc.
Para Saber mais
  • Squid Web Proxy Cache

http://www.squid-cache.org/

Instalação do Squid

Para instalar o Squid no Mandriva Linux, utilize o urpmi:

#urpmi squid -auto

Para instalar o Squid no Ubuntu, utilize o apt-get:

#apt-get install squid

O código fonte do Squid pode ser obtido no site oficial do projeto listado na seção "Para saber mais".

Configurando o Squid

A Configuração do squid fica gravada em um arquivo chamado squid.conf, no diretório /etc/squid.

Entre várias opções de configurações do Squid, algumas merecem atenção especial pois definem o funcionamento básico do programa.

http_port n

Esta opção é utilizada para definir em quais portas (n) o squid espera por conexões http. A porta padrão é 3128, mas é possível especificar uma outra qualquer, dependendo da necessidade.

Exemplo: http_port 3128

cache_dir Tipo diretório Mbytes Nível-1 Nível-2

Esta opção serve para definir em quais diretórios serão armazenados os objetos. Tipo especifica o tipo de sistema de armazenamento a ser utilizado. Atualmente o tipo que pode ser utilizado com segurança é ufs.

Diretório especifica o nome do diretório onde há o arquivo que mantém os metadados dos objetos armazenados no disco. Este arquivo é utilizado para recriar o cache durante a inicialização do Squid. Mbytes especifica a quantidade de espaço em disco que deverá ser utilizada sob este diretório.

O valor padrão é 100 MB. Nível-1 e Nível-2 especificam o número de diretórios de primeiro e segundo nível, respectivamente, a serem criados, definindo na opção Diretório. Os valores padrão são 16 e 256, respectivamente. É possível ter vários diretórios para cache, inclusive em discos distindos.

Exemplo: cache_dir ufs /var/spool/squid 100 16 256

cache_mgr e-mail

Esta opção permite especificar o e-mail do usuário do sistema que receberá uma mensagem caso o Squid venha a ser encerrado de forma anormal. Este endereço também é mostrado em páginas de erros retornadas aos usuários caso, por exemplo, a máquina remota não possa ser acessada.

Exemplo: cache_mgr squid_adm@imasters.com.br

cache_efective_user usuarop, cache_efective_group grupo

Estas opções servem para informar ao Squid com qual ID de usuário e de grupo, respectivamente, ele deve ser executado, caso seja iniciado como root, que é como ele costuma ser iniciado.

Exemplo: cache_efective_user squid

cache_efective_group squid|

cache_mem mem

O squid utiliza muita memória por razões de desempenho. É muito mais demorado ler algo do disco do que diretamente da memória como todos sabem. Mas deve-se estar atento ao definir este valor, pois esse parâmetro não é o total de memória que o Squid usa, ele apenas põe um limite em um dos aspectos da memória. Mas ele usa memória para outras atividades, assim, é necessário reservar espaços para os outros processos.

Para verificar quanta memória o squid esta utilizando, podemos utilizar o comando top, por exemplo.

Exemplo: cache_mem 8MB|

visible_hostname computador

Esta opção define o nome do computador que aparece em mensagens de erro e em outras informações compartilhadas entre servidore cache. Colocar o nome do computador local.

Exemplo: visible_hostname Parede_de_fogo

Para iniciar o serviço squid como super usuário (root), o comando:

#service squid start (Mandriva)|

etc/init.d# ./squid start (Ubuntu)

Controle de acesso

O controle de acesso do squid tem recursos suficientes para definir com precisão quais tipos de serviços podem ser acessados por quais máquinas e em quais horários. As regras da lista de controle de acesso (Access Control List ou simplismente ACLs) tem uma sintaxe bastante simples, e são incluídas no arquivo squid.conf

Tipos de elementos de ACL:

  • src: endereço IP de origem (cliente);
  • dst: endereço IP de destino (servidor);
  • srcdomain: um domínio de origem (cliente);
  • dstdomain: um domínio de destino (servidor);
  • srcdom_regex: padrão de texto, ou expressão regular, que conste no conteúdo da origem (cliente);
  • dstdom_regex: padrão de texto, ou expressão regular, que conste no conteúdo do destino (servidor);
  • time: hora do dia e dia da semana;
  • url_regex: comparação de URL baseada em expressão regular;
  • port: número da porta do destino (servidor);
  • myport: número da porta local na qual o cliente se conectou;
  • proto: protocolo de transferência (http, ftp, etc);
  • method: método http de requisição (get, post, etc);
  • browser: Comparação executada baseada no cabeçalho (header) do cliente (browser);
  • ident: nome do usuário;
  • src_as: número do Sistema Autônomo da origem (cliente);
  • dst_as: número do Sistema Autônomo do destino (servidor);
  • proxy_auth: autenticação do usuário via um processo externo;
  • proxy_auth_regex: expressão regular que consta em uma autenticação de usuário via um processo externo;
  • snmp_community: string que indica o nome da comunidade SNMP;
  • maxconn: um número máximo de conexões de um mesmo endereço IP de cliente;
  • arp: endereço Ethernet (MAC).

Nem todos os elementos de ACL podem ser usados com todas as listas de acessos (descritas a seguir). Por exemplo, snmp_community só terá significado quando usado com a lista snmp_access, bem como, os elementos src_as e dst_as somente serão usados na lista cache_peer_access.

Cada elemento de ACL deve ser relacionado com somente um nome. Um elemento ACL com determinado nome consiste em uma lista de valores. Quando forem sendo feitos os testes, os múltiplos valores utilizarão o operador lógico OR. Em outras palavras, um elemento ACL será válido, quando qualquer um de seus valores forem verdadeiros.

Você não pode dar o mesmo nome para diferentes tipos de elementos ACLs. Isto ocasionará um erro de sintaxe.

Você poderá colocar diferentes valores para a mesma ACL em diferentes linhas. O Squid os combinará em uma lista.

Lista de Acessos:

  • http_acess: permite clientes http (browsers) acessarem a porta http. Esta ACL é a primária;
  • icp_access: permite cachês "vizinhos" fazerem requisições ao seu cache através do protocolo ICP;
  • miss_access: permite a alguns clientes fazerem encaminhamento (forward) através de seu cache;
  • no_cache: define respostas que não deverão ser armazenadas no cache;
  • always_direct; controla quais requisições deverão ser sempre encaminhadas diretamente aos servidores de igem;
  • never_direct: controla quais requisições nunca deverão ser sempre encaminhadas diretamente aos servidores de origem;
  • snmp_access: controla acesso ao agente SNMP do squid;
  • cache_peer_access: controla quais requisições poderão ser encaminhadas a um servidor de cache vizinho. (peer)

Uma regra de lista de acesso, consite da palavra allow (permitir) ou deny (negar), seguido de uma lista de nomes de elementos ACL.

Uma lista de acesso consiste em uma ou mais regras de acesso.

As listas de acesso são verificadas na mesma ordem em que foram escritas. A pesquisa na lista termina assim que uma requisição satisfazer uma regra.

Se uma regra possuir múltiplos elementos de ACL, esta usará o operador lógico AND. Em outras palavras, todos os elementos de uma regra precisarão ser validos para que esta regra seja válida. Isto significa que é possível escrever uma regra que nunca será válida. Por exemplo, um número de porta nunca poderá ser igual a 80 e 8000 ao mesmo tempo.

Vejam alguns exemplos práticos:

Se você quiser impedir que qualquer usuário acesse paginas que contenham a palavra "cracker" na URL, acrescente as seguintes linhas no seu squid.conf:

acl proibir_cracker url_regex cracker|

http_access deny proibir_cracker

E o bloqueio ainda pode ser para máquinas especificas. Imagine que o usuário da máquina cujo IP é 10.0.0.95 esteja ocupando muito a sua rede, transferindo arquivos de música em formato MP3. Para bloquear este usuário especifico, use a regra como a de baixo:

acl mp3 url_regex mp3|

acl usr_ofensor src 10.0.0.95/255.255.255.255|

http_access deny usr_ofensor mp3

Se quiser proibir todos os usuários de acessarem um determinado site:

acl site_proibido dstdomain .orkut.com|

http_access deny all site_proibido

Também é possível permitir ou proibir o acesso em determinados dias e horários:

acl tempo_proibido time MTWHF 15:00-16:00|

acl usr_ofensor src 10.0.0.95/255.255.255.255|

http_access deny usr_ofensor tempo_proibido

A regra acima bloqueia o acesso à internet para o IP 10.0.0.95 durante o período das 15:00 às 16:00 horas. A opção MTWHF indica os dias da semana em inglês. Também pode ser utilizadas as opções A e S que equivalem ao sábado e ao domingo respectivamente.

Existem casos que uma empresa gostaria de liberar o acesso a internet apenas durante o horário de almoço.

Para isso, a seguinte regra poderia ser aplicada:

acl funcionários src 10.0.0.0/0|

acl acesso_almoco time MTWHF 12:00-13:00|

http_access allow funcionários acesso_almoco|

http_access deny funcionários

Dependendo do número de domínios ou de palavras-chave listadas em ACLs é aconselhável construir uma lista em um arquivo separado e indicá-lo no squid.conf. O arquivo com uma lista de domínios ou de expressões regulares a serem bloqueadas deve conter uma entrada por linha, como no exemplo:

  • Orkut
  • Playboy
  • Sexo
  • Blog
  • Fotolog

Caso o arquivo seja salvo em /etc/squid/sites_proibidos, por exemplo podemos indicá-lo no arquivo de configuração do squid da seguinte maneira:

acl funcionários src 10.0.0.0/0|

acl proibidos url_regex "/etc/squid/sites_proibidos" |

http_access deny funcionários proibidos

Após incluir todas as suas regras restritivas, não se esqueça de incluir regras especificando que tudo o que não estiver expressamente proibido deve ser permitido. Na configuração original do squid.conf, as linhas serão como a que segue:

acl rede_local src 10.0.0.0/255.0.0.0|

http_access allow all rede_local

Note que você deve definir a ‘rede_local’ como conjunto de endereço IP e máscara que melhor descrevem a sua rede.

Normalmente o seu squid.conf virá com linhas como as que seguem:

## INSERT YOUR OWN RULE(S) HERE ALLOW ACCESS FROM YOUR CLIENTS#
 http_access deny all

Ela serve para bloquear o acesso ao squid até que ele seja configurado, e é interessante você deixá-lo como última regra, pois desta forma, se a requisição não satisfazer nenhuma regra o squid irá bloqueá-la.

Proxy Transparente

Utilizar o proxy transparente evita que o administrador tneha que configurar o navegador web de cada usuário da rede, pois o uso do proxy passa a ser despercebido para o usuário. Alem disso, evita que o usuário possa desabilitar o proxy e navegar diretamente na internet.

Para iniciarmos a configuração do squid como proxy transparente, insira ou descomente as seguintes linhas no arquivo /etc/squid/squid.conf

httpd_accel_host virtual|

httpd_accel_port 80|

httpd_accel_with_proxy on|

httpd_accel_uses_host_header on

E, como root, execute o comando:

#iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j REDIRECT –to- port 3128

Caso o iptables não esteja instalado, instale-o antes:

#urpmi iptables -auto

Ou

#apt-get install iptables

Note que no exemplo acima utilizamos a interface de rede eth0 como se fosse a interface ligada na rede local. Você deve adaptar o exemplo à sua rede. O exemplo também assume que o iptables e o servidor proxy estão sendo executados na mesma máquina. Caso os serviços estejam em máquinas separadas, a linha de comando para o iptables é ligeiramente diferente:

#iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j REDIRECT –to-dest IP:3128

IP – Deve ser substituido pelo endereco IP da máquina onde o servidor squid esta sento executado.

Para que esta regra esteja ativa logo após a inicialização do sistema operacional, execute em seguida os comandos:

#iptables -save > /etc/sysconfig/iptables|

#chkconfig iptables on

Ao reiniciar o squid (#service squid restart ou etc/init.d# ./squid restart) os clientes já poderão navegar normalmente em necessidade de especificar no browser qual servidor proxy deve ser utilizado.

Dicas

  • Não esqueça de verificar os arquivos de log do Squid quando não estiver conseguindo resolver algum problema. O Diretório padrão de armazenamento dos arquivos de log é: /var/log/squid/. Os principais arquivos são cache.log, access.log e o squid.out, que armazenam respectivamente, informações sobre o cache do servidor proxy, os acessos feitos através do proxy e mensagens de erro emitidas pelo deamon do Squid.
  • Aqueles que preferem uma interface gráfica para configuração de servidores podem optar pelo Webmin, um gerenciador de sistema com interface web que contém um módulo para gerenciamento do Squid. O download do Webmin pode ser feito através do site http://www.webmin.com

Artigo de Guilherme Zanoni para o Imasters

http://imasters.uol.com.br/artigo/6220/linux/servidor_proxy_squid/