Proxy SQUID Professor: João Paulo de Brito Gonçalves Campus Cachoeiro Curso Técnico em Informática
Proxy (definições) 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 tenha 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.
Proxy (definições) Justamente por isto que este tipo de servidor é chamado de proxy, pois é um procurador, ou seja, sistema que faz solicitações em nome de outros. O proxy SQUID é como um burocrata que não se limita a simplesmente repassar as requisições: ele analisa todo o tráfego de dados, separando o que pode ou não pode passar e guardando as informações para uso posterior, de forma semelhante à um firewall.
Configuração de um proxy no navegador A configuração de um proxy muda de navegador para navegador, mas é necessária para que o navegador consiga se conectar através do proxy nos servidores WEB. Além do navegador, outros programas podem ser configurados para trabalharem através do proxy: clientes de SKYPE e até programas P2P. As vantagens em se utilizar um proxy são basicamente três:
Proxy - Funções 1) É possível impor restrições de acesso com base no horário, login, endereço IP da máquina e outras informações e bloquear páginas com conteúdo indesejado. 2) O proxy funciona como um cache de páginas e arquivos, armazenando informações já acessadas. Quando alguém acessa uma página que já foi carregada, o proxy envia os dados que guardou no cache, sem precisar acessar a mesma página repetidamente. 3) É possível logar todos os acessos feitos através do proxy, sendo possível visualizar os acessos posteriormente utilizando o Sarg.
Modalidades de Proxy - Proxy Transparente é um proxy onde não é necessário configurar o navegador para apontar para o seu endereço, pois através de uma regra do iptables, todo o tráfego direcionado para a porta 80 é redirecionado para a porta 3128. - Proxy não-transparente é o proxy padrão, onde é necessário configurar o navegador, para que ele possa acessar o proxy e se conectar através dele. Sem esta configuração, é impossível acessar a Web se o computador onde está o proxy é o único ponto de conexão com a Internet na rede.
Instalando o SQUID O SQUID é composto de um único pacote, por isso a instalação é simples. Toda a configuração do SQUID é feita em um único arquivo, o /etc/squid3/squid.conf. O arquivo original, instalado junto com o pacote, é realmente enorme, Roteador contém comentários e exemplos para quase todas as opções disponíveis.
Arquivo de configuração básico http_port 3128 visible_hostname nome_da_maquina acl localhost src 127.0.0.1 acl all src all http_access allow localhost http_access deny all Estas linhas são suficientes para o que Squid funcione. As linhas dizem o seguinte: Roteador
Arquivo de configuração básico http_port 3128 a porta onde o servidor Squid vai ficar disponível. A porta 3128 é o padrão. visible_hostname nome_da_maquina o nome do servidor, o mesmo que foi definido na configuração da rede. acl localhost src 127.0.0.1 e http_access allow localhost: estas duas linhas criam uma ACL(uma política de acesso) chamada localhost, que se refere ao endereço da interface de loopback da máquina. Ele permite que a máquina local use o proxy sem restrições.
Arquivo de configuração básico acl all src all e http_access deny all: estas duas linhas criam uma ACL(uma política de acesso) chamada all, incluindo todos os endereços IP possíveis. Esta regra faz com que qualquer máquina que não tenha sido permitida anteriormente seja bloqueada. Ou seja, esta regra faz com que qualquer máquina que não seja o localhost tenha o seu acesso bloqueado pelo proxy.
Arquivo de configuração básico Configure o seu navegador usando o endereço IP 127.0.0.1 para usá-lo como proxy, com a porta 3128, e teste a conexão. Se tudo estiver ok, você conseguirá acessar o proxy através do servidor proxy instalado na sua máquina local.
ACLs 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 (ACLs) têm uma sintaxe bastante simples, e são incluídas no arquivo squid.conf.
Tipos de Elementos de ACL http_access: permite clientes HTTP (browsers) acessarem a porta HTTP. Esta é a ACL primária e serve de base para permitir ou negar o acesso de todas as outras. - allow permite o acesso à ACL - deny nega o acesso à ACL
Tipos de Elementos de ACL src endereço IP de origem (cliente). dest endereço IP do destino (servidor). Exemplo: acl redelocal src 172.16.48.0/255.255.240.0 http_access deny redelocal Bloqueia qualquer acesso de qualquer máquina. acl usuario_ofensor src 10.0.0.95 http_access deny usuario_ofensor Bloqueia o acesso da máquina 10.0.0.95.
Tipos de Elementos de ACL srcdomain um domínio de origem(cliente) dstdomain um domínio de destino(servidor). Exemplo: acl bloqueados dstdomain www.orkut.com http_access deny bloqueados Foi criada uma acl bloqueados que contém o endereço www.orkut.com e em seguida foi incluída a regra para bloquear o acesso ao domínio.
Tipos de Elementos de ACL url_regex: comparação de um URL baseada em expressão regular. Exemplo: acl proibir_cracker url_regex cracker http_access deny proibir_cracker Impede que qualquer usuário acesse páginas que contenham a palavra cracker na URL.
Tipos de Elementos de ACL Um tipo de bloqueio útil em muitas situações é com relação a formatos de arquivos. Você pode querer bloquear o download de arquivos.exe ou.sh para dificultar a instalação de programas nas estações, ou bloquear arquivos.avi ou.wmv para economizar banda da rede, por exemplo. Neste caso, você pode usar a regra a seguir, especificando as extensões de arquivo desejadas. Ela utiliza o parâmetro "url_regex" dessa vez procurando pelas extensões de arquivos especificadas: acl extban url_regex -i \.avi \.exe \.mp3 \.torrent http_access deny extban
Tipos de Elementos de ACL -Time permite especificar hora do dia e dia da semana que se deseja proibir ou permitir o acesso à Internet. Exemplo: acl madrugada time 00:00-06:00 http_access deny madrugada Acl almoco time 12:00 14:00 http_access deny almoco Proxy irá bloquear acessos feitos de madrugada ou no horário de almoço.
Tipos de Elementos de ACL -Para bloquear dias da semana específicos temos a tabela: acl expediente time MTWHF 09:00-18:00 http_access allow expediente acl final_de_semana time SA 8:00-13:00 http_access deny final_de_semana
Tipos de Elementos de ACL Proto Protocolo de transferência Exemplo: acl manager proto cache_object http_access allow manager Roteador Permite que o cache de objetos seja acessado.
Tipos de Elementos de ACL Port número de porta de destino (servidor) Exemplo: acl safe_port port 21 http_access allow safe_port Permite o acesso à Roteador porta 21 de destino no servidor passando pelo proxy.
Tipos de Elementos de ACL Arp permite filtrar o acesso por MAC Adress. Exemplo: Acl mac arp 00:11:22:33:44:55 http_access deny mac Roteador Bloqueia qualquer pacote vindo da máquina com endereço MAC 00:11:22:33:44:55
Parâmetros de Configuração cache_mem configura o tamanho de memória RAM que será usado como cache. É interessante configurar uma cache em memória principal, pois a leitura em disco é um processo muito mais demorado. Exemplo: cache_mem 128 MB cache_dir - permite definir em quais diretórios serão armazenados os objetos, ou seja, especifica o cache em disco a ser utilizado. É necessário especificar o tipo de sistema de arquivos a ser utilizado no armazenamento. Atualmente o tipo que pode ser utilizado com segurança é o ufs. Exemplo: cache_dir ufs /var/spool/squid3 2048 16 256
Parâmetros de Configuração maximum_object_size_in_memory determina o tamanho máximo dos arquivos que serão guardados no cache feito na memória RAM (o resto vai para o cache feito no HD). O cache na memória é muito mais rápido, mas é interessante deixá-lo para arquivos menores, pois seu tamanho é reduzido. maximum_object_size_in_memory 64 MB maximum_object_size minimum_object_size configuração da cache em disco, que armazenará os arquivos maiores. Por padrão o máximo são downloads de 256 MB e o mínimo é zero, o que faz com que mesmo imagens e arquivos pequenos sejam armazenados no cache.
Parâmetros de Configuração cache_access_log define o arquivo onde serão guardados os logs de acesso do SQUID. Por padrão, o SQUID guarda o log de acesso no arquivo /var/log/squid3/access.log. Caso a lista de domínios permitidos ou bloqueados se torne grande demais, pode-se optar por criar um arquivo de sites negados ou sites permitidos e referenciá-lo no arquivo de configuração. Exemplo: acl permitidos url_regex i /etc/squid3/permitidos http_access allow permitidos acl bloqueados url_regex i /etc/squid3/bloqueados http_access deny bloqueados
Parâmetros de Configuração Mais uma configuração que você pode querer alterar é o padrão de atualização do cache. Estas três linhas precisam sempre ser usadas em conjunto, ou seja, você pode alterá-las, mas sempre as três precisam estar presentes no arquivo. Eliminando uma, o Squid ignora as outras duas e usa o default. Os números indicam o intervalo (em minutos) que o Squid irá aguardar antes de verificar se um item do cache (uma página, por exemplo) foi atualizado, para cada um dos três protocolos.
Parâmetros de Configuração O primeiro número (o 15) indica que o Squid verificará (a cada acesso) se as páginas e arquivos com mais de 15 minutos foram atualizados. Ele faz uma verificação rápida, checando o tamanho do arquivo e, se o arquivo não mudou, ele continua fornecendo aos clientes o arquivo que está no cache, economizando banda da conexão O terceiro número (o 2280, equivalente a dois dias) indica o tempo máximo, depois do qual o objeto é sempre verificado. Além do http e ftp, o Squid suporta o protocolo gopher, que era muito usado nos primórdios da internet para localizar documentos de texto, mas perdeu a relevância hoje em dia.
Parâmetros de Configuração - Desta forma, os parâmetros ficariam da seguinte forma na configuração: refresh_pattern ^ftp: 15 20% 2280 refresh_pattern ^gopher: 15 0% 2280 refresh_pattern. 15 20% 2280
Parâmetros de Configuração - Caso você queira reiniciar o cache do SQUID, pode usar o comando: squid3 z - Em alguns casos, principalmente quando existem usuários acessando a Internet, reiniciar o proxy pode gerar transtornos desconectando estes usuários temporariamente da Internet. Para solucionar o problema, pode-se após realizar alguma alteração na configuração utilizar o comando service squid reload - Este comando atualiza a configuração do SQUID sem precisar reiniciá-lo.
Proxy Autenticado Você pode adicionar uma camada extra de segurança exigindo autenticação no proxy. Este recurso pode ser usado para controlar quem tem acesso à internet e auditar os acessos em caso de necessidade. Quase todos os navegadores oferecem a opção de salvar a senha, de modo que o usuário precisa digitá-la apenas uma vez a cada sessão. A forma mais simples de implementar autenticação no Squid é usando o módulo basic_ncsa_auth", que faz parte do pacote principal. Ele utiliza um sistema simples, baseado em um arquivo de senhas, onde você pode cadastrar e bloquear os usuários rapidamente.
Proxy Autenticado Para criar o arquivo de senhas, precisamos do script "htpasswd". Nas distribuições derivadas do Debian ele faz parte do pacote apache2-utils, que você pode instalar via apt-get: # apt-get install apache2-utils Em seguida, crie o arquivo que será usado para armazenar as senhas, usando o comando "touch" (que simplesmente cria um arquivo de texto vazio): # touch /etc/squid3/squid_passwd O próximo passo é cadastrar os logins usando o htpasswd, especificando o arquivo que acabou de criar e o login que será cadastrado, como em: # htpasswd /etc/squid3/squid_passwd gdh
Proxy Autenticado Depois de terminar de cadastrar os usuários, adicione as linhas que ativam a autenticação no squid.conf: auth_param basic realm Squid auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/squid_passwd acl autenticados proxy_auth REQUIRED http_access allow autenticados O "auth_param basic realm Squid" indica o nome do servidor, da forma como ele aparecerá na janela de autenticação dos clientes; esta é na verdade uma opção meramente estética. O "/usr/lib/squid3/ncsa_auth" é a localização da biblioteca responsável pela autenticação.
Proxy Autenticado Estas quatro linhas criam uma acl chamada "autenticados" (poderia ser outro nome), que contém os usuários que se autenticarem usando um login válido. Estas linhas devem ser colocadas antes de qualquer outra regra que libere o acesso, já que, se o acesso é aceito por uma regra anterior, ele não passa pela regra que exige autenticação.
Proxy Transparente Um dos principais problemas de usar um proxy é que você precisa configurar manualmente cada micro da rede para utilizá-lo, o que é um trabalho cansativo e tedioso, sobretudo em grandes redes. O Squid responde a este desafio com a possibilidade de criar um proxy transparente, onde o proxy se integra a uma rede já existente, acelerando a conexão, mas sem precisar de qualquer configuração nos clientes.
Proxy Transparente Basta substituir a linha http_port 3128 por http_port 3128 transparent Ou seja, na verdade você precisa apenas adicionar o "transparent", para que o Squid passe a entender as requisições redirecionadas pela regra do firewall.
Network Adress Translation(NAT) NAT (Network Address Translation), ou tradução de endereço de rede, é uma técnica que altera os endereços de um pacote, e altera os pacotes de forma inversa. O NAT tem três utilidades básicas: o SNAT, O DNAT e proxy transparente. O SNAT ou Source-NAT, consiste em alterar o endereço de origem dos pacotes. A principal utilização do SNAT é o Masquerading, ou mascaramento de IPs, permitindo o compartilhamento de um único endereço IP válido com acesso à internet com uma rede de IPs não-válidos.
NAT: Network Address Translation resto da Internet 138.76.29.7 10.0.0.4 rede local (e.x., rede caseira) 10.0.0/24 10.0.0.1 10.0.0.2 10.0.0.3 Todos os datagramas deixando a rede local têm o mesmo único endereço IP NAT origem: 138.76.29.7, e diferentes números de porta origem Datagramas com origem ou destino nesta rede usam endereços 10.0.0/24 para origem e destino (como usual)
NAT: Network Address Translation Motivação: a rede local usa apenas um endereço IP, no que concerne ao mundo exterior: não há necessidade de alocar faixas de endereços do ISP: apenas um endereço IP é usado para todos os dispositivos pode modificar endereços de dispositivos na rede local sem notificar o mundo exterior pode trocar de ISP sem mudar os endereços dos dispositivos na rede local dispositivos dentro da rede local não são explicitamente endereçáveis, i.e., visíveis do mundo exterior (um incremento de segurança)
NAT: Network Address Translation Implementação: um roteador NAT deve: datagramas saindo: trocar (IP origem, # porta) de cada datagrama saindo para (IP NAT, novo # porta)... clientes/servidores remotos vão responder usando (IP NAT, novo # porta) como endereço destino. lembrar (na tabela de tradução NAT) cada par de tradução (IP origem, # porta ) para (IP NAT, novo # porta) datagramas entrando: trocar (IP NAT, novo # porta) nos campos de destino de cada datagrama entrando para o (IP origem, # porta) correspondente armazenado na tabela NAT
NAT: Network Address Translation 2: roteador NAT muda end. origem do datagrama de 10.0.0.1, 3345 p/ 138.76.29.7, 5001, e atualiza tabela Tabela de tradução NAT end. lado WAN end. lado LAN 138.76.29.7, 5001 10.0.0.1, 3345 O: 10.0.0.1, 3345 D: 128.119.40.186, 80 1: host 10.0.0.1 envia datagrama p/ 128.119.40.186, 80 10.0.0.1 2 O: 138.76.29.7, 5001 D: 128.119.40.186, 80 10.0.0.4 1 10.0.0.2 138.76.29.7 O: 128.119.40.186, 80 D: 138.76.29.7, 5001 3 3: Resposta chega p/ end. destino: 138.76.29.7, 5001 O: 128.119.40.186, 80 D: 10.0.0.1, 3345 4 10.0.0.3 4: roteador NAT muda end. destino do datagrama de 138.76.29.7, 5001 p/ 10.0.0.1, 3345
NAT: Network Address Translation campo do número de porta com 16-bits: 60.000 conexões simultâneas com um único endereço no lado WAN! NAT é controverso: roteadores deveriam processar somente até a camada 3 viola o argumento fim-a-fim possibilidade do uso de NAT deve ser levado em conta pelos projetistas de aplicações (p.e., P2P) escassez de endereços, por outro lado, deveria ser resolvida com o IPv6
Source-NAT O SNAT é feito na chain POSTROUTING, da tabela nat. Ou seja, a alteração no endereço de origem do pacote é a última coisa a ser feita antes de ele ser enviado para a Internet. POSTROUTING refere-se a pacotes que serão modificados na saída do firewall, ou seja, é uma chain que pode conter regras que alteram o endereço de origem do pacote que entra em uma condição definida pelo administrador e, após atravessar e sair do firewall o pacote passa a ter um novo cabeçalho "mascarando" a origem do mesmo.
Source-NAT Este tipo de cadeia pertence à tabela NAT e portanto não trata pacotes com destino a serviços instalados e em execução no próprio firewall, agindo em pacotes com destino à rede externa. O target do pacote deve ser SNAT, e o endereço de saída é especificado pelo parâmetro --to-source <endereço-de-saída>.também pode ser especificada uma faixa de IPs ou endereços discretos. Exemplo: iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth0 -j SNAT --to-source 20.13.25.3
Source-NAT Existe uma modalidade de SNAT chamada Masquerading, especialmente útil para fazer SNAT em conexões com IP dinâmico (DHCP, linha discada), que é feita usando como target MAQUERADE e especificando a interface de saída. # iptables -t nat -A POSTROUTING -s 192.168.4.0/24 \ -o ppp0 -j MASQUERADE
Destination-NAT O Destination-NAT ou DNAT é feito na chain PREROUTING, também da tabela nat. Nesta cadeia, as alterações no pacote serão feitas antes de qualquer roteamento. Para fazer DNAT, é necessário especificar o target DNAT, o novo endereço de destino, com o parâmetro --to-destination <endereço-de-destino>. Podem ser especificados também a interface de entrada. Também é possível fazer redirecionamento de porta usando DNAT, o que permite que um computador da rede externa acesse um serviço executando em uma máquina da rede local, sendo redirecionado pelo firewall.
Destination-NAT O PREROUTING trata o pacote antes deste entrar no roteamento do servidor e portando pode ter o destino do pacote modificado. Sintaxe: iptables -A PREROUTING -t nat -p tcp -- dport portaexterna -i interface -j DNAT todestination maquinainterna:portainterna Exemplo: iptables A PREROUTING t nat p tcp --dport 21 i eth0 j DNAT --to-destination 192.168.1.2:21
Destination-NAT
Proxy Transparente Ao usar um proxy transparente, você tem basicamente uma conexão compartilhada via NAT, com a mesma configuração básica nos clientes. O proxy entra na história como um adicional. Uma regra de firewall envia as requisições recebidas na porta 80 do servidor para o proxy, que se encarrega de responder aos clientes. Proxy transparente é a forma que a tabela NAT possui de realizar um redirecionamento de portas em um mesmo computador de destino.
Proxy Transparente e Iptables Logo, podemos concluir que o proxy-cache SQUID faz um redirecionamento das portas solicitadas por seus clientes, uma vez que os mesmos solicitam conexão via porta 80 e são redirecionados à porta 3128. Utilizamos então para esta finalidade as cadeias PREROUTING da tabela NAT, tal como o alvo REDIRECT no iptables.
Proxy Transparente e iptables Então o comando do iptables que deve ser usado é: iptables -t nat -A PREROUTING -i eth0 -p tcp -- dport 80 -j REDIRECT --to-port 3128 Onde: iptables -> chama o firewall iptables. -t nat carrega a tabela nat para a o uso na regra -A PREROUTING usa a cadeia PREROUTING da tabela nat para criar uma regra -i eth0 -> seleciona a interface da rede eth0, por onde os pacotes com destino à Internet entram
Proxy Transparente e iptables -p tcp -> indica que o protocolo da camada de transporte usado será o tcp --dport 80 -> indica que a porta de destino dos pacotes será a porta 80(tráfego web) -j REDIRECT -> indica a ação a ser aplicada à regra, no caso um redirecionamento. --to-port 3128 -> indica a porta para a qual será redirecionado o tráfego com destino na porta 80.
SARG O Sarg é um interpretador de logs para o Squid. Sempre que executado, ele cria um conjunto de páginas, divididas por dia, com uma lista de todas as páginas que foram acessadas e a partir de que máquina da rede veio cada acesso. Caso você tenha configurado o Squid para exigir autenticação, ele organiza os acessos com base nos logins dos usuários. Caso contrário, ele mostra os endereços IP das máquinas.
SARG Os acessos são organizados por usuário (caso esteja sendo usada autenticação) ou por IP, mostrando as páginas acessadas por cada um, quantidade de dados transmitidos, tempo gasto em cada acesso, tentativas de acesso bloqueadas pelos filtros de conteúdo e outras informações. Além disso, ele faz um demonstrativo dos sites mais acessados pelos usuários do proxy.
SARG O Sarg é incluído na maioria das distribuições atuais, em alguns casos instalado por padrão junto com o Squid. No Debian e derivados ele pode ser instalado com um: # apt-get install sarg
SARG Depois de instalado, chame o comando "sarg" (como root) para que os relatórios sejam gerados automaticamente a partir do log do Squid O Sarg não é um daemon que fica residente, você precisa apenas chamá-lo quando quiser atualizar o relatório. Após chamado, os relatórios gerados pelo SARG ficam por padrão em /var/lib/sarg
SARG Para criar os relatórios do SARG é necessário acessar o arquivo de configuração em /etc/sarg/sarg.conf. Dois parâmetros devem ser configurados: access log /var/log/squid3/access.log Para configurar o arquivo de log do SQUID que será usado para gerar os relatórios output_dir /var/www/squid-reports Para que os relatórios do SARG geram gerados dentro de /var/www e podem ser visualizados através do APACHE
Configurações Adicionais - Você pode definir ainda a percentagem de uso do cache que fará o SQUID começar a descartar os arquivos mais antigos. Por padrão, sempre que o cache atingir 95% de uso, serão descartados arquivos antigos até que a percentagem volte para um número abaixo de 90%. cache_swap_low 90 cache_swap_high 95
Configurações Adicionais - Você pode modificar a mensagem de erro no seu proxy para Português usando dentro do arquivo de configuração a linha: error_directory /usr/share/squid3/errors/pt-br Você pode ainda personalizar as páginas de erro editando os arquivos dentro da pasta /usr/share/squid3/erros/pt_br ou /usr/share/squid3/erros/english (de acordo com a língua definida na configuração). A pasta contém vários arquivos html, um para cada tipo de erro indicado.