Squid Antes de explicar o que é o Squid devemos falar um pouco sobre Proxy, ou seja, o que é um Servidor Proxy. Para responder essa pergunta apresentamos a figura abaixo, na qual temos um rede DMZ, na qual há um servidor Proxy funcionando. Na figura abaixo temos diagrama mostrando 3 computadores acessando um mesmo endereço na internet (http://www.linuxbrasil.org.br/exemplo1.html). O que um servidor Proxy faz é ofertar as páginas estáticas em html e outros formatos estáticos, que no exemplo ao lado é a página exemplo1.html. Note que as consultas feitas pela página exemplo1.html e feita e respondida pelo servidor Proxy, o qual armazena localmente em cache esta página quando um dos 3 computadores da LAN faz a consulta pela mesma, ou seja, digamos por exemplo, que o computador à esquerda tenha feito a consulta inicialmente. Então o servidor Proxy terá que buscar esta página diretamente no site do Projeto Linux Brasil e, em seguida irá armazená-la em cache para que os outros 2 computadores a encontrem no servidor Proxy posteriormente. 1
2
Quando novos computadores forem adicionados a esta LAN, as consultas pela página exemplo1.html serão respondidas diretamente pelo servidor Proxy, não sendo necessária uma nova consulta diretamente no portal do Projeto Linux Brasil para repassar ao novo computador. Dessa forma fica fácil ver os porquês de se utilizar servidores Proxy em redes locais (LANs). 3
O Squid é um dos mais populares servidores Proxy no mundo Linux e um dos melhores programas para missão crítica de controle de conteúdo (controle do acesso à internet). Podendo esconder requisições repetidas (envitar consumo da largura de banda da rede junto ao seu provedor), esconder www e DNS, e outros recursos de rede compartilhados para um grupo de pessoas numa rede local (LAN). Ele pode ser usado tanto em sistemas Linux / Unix e Windows. Além dos atributos acima, o Squid está em desenvolvimento há muito tempo, seu código é aberto, com licença GNU GPL e funciona com muitos protocolos, tais como TLS, SSL e HTTPS, embora seja principalmente usado para HTTP e FTP. Com todas essas atribuições, este software torna-se completo e eficaz para realizar missões críticas em situações reais nas empresas. Tanto é que centenas de provedores de internet o utilizam para oferecer conteúdo aos seus usuários. Instalando o Squid O Squid pode ser encontrado diretamente no site oficial do Projeto: http://www.squid-cache.org/. Abordaremos aqui a instalação no Debian, Fedora / Red Hat. Para instalar o Squid no Debian e semelhantes use o seguinte comando (logado como root e conectado à internet, é claro): # apt-get install squid3 4
Siga as instruções que aparece (escolha S, é claro) para poder instalar. Já a instalação no Fedora é feita assim: # yum install squid Configuração do servidor Proxy Squid Arquivo de configuração Debian /etc/squid3/squid.conf /etc/squid/squid.conf Fedora Usaremos o arquivo squid.conf baseado no Debian, que contém aproximadamente 3000 linhas e pode ser editado retirando os comentários com #, portanto faça uma copia antes. 5
# cp squid.conf squid.conf.original Agora explicaremos as principais diretivas arquivo squid.conf onde você pode editá-lo com qualquer editor de texto kwrite, gedit (ambiente gráfico) e vi, nano e mcedit (modo texto) utilizando o recurso de localizar texto dos editores de texto. No final mostraremos o arquivo já configurado e pronto para ser utilizado. Editando o squid.conf Define a porta do squid http_port 3128 Esse é o diretório de cache do squid onde são armazenadas as páginas da internet, onde 100 é tamanho em MB (Megabytes) do cache, 16 o número de diretórios e 256 o número de subdiretórios de cada diretório. cache_dir ufs /var/spool/squid3 100 16 256 Essa opção indica a quantidade de memória RAM que o squid irá consumir, no caso de um servidor squid exclusivo para cache deve-se utilizar 80% a 90% de toda memória RAM do computador. Por exemplo 512 MB de RAM (80% de 512 MB = cache_mem 410 MB), 128 MB é um bom valor para começar com 512 MB ou 1 GB. cache_mem 8 MB Essa opção define a porcentagem de limite mínimo para substituição de um objeto(páginas e imagens), essa substituição inicia quando o swap em disco estiver acima do limite mínimo definido aqui. 6
cache_swap_low 90 Define o limite máximo, é o contrário de cache_swap_low cache_swap_high 95 Essa opção define o tamanho máximo de um objeto em cache, os objetos maiores do que esse limite, não serão salvos em disco. Um número grande indica economia de banda e perda de performance no cache, um número pequeno menor não economiza largura de banda, mas aumenta a velocidade do cache para o tempo de resposta. É recomendado um valor entre 4 e 16 MB. maximum_object_size 4096 KB Os objetos maiores do que esse tamanho, não serão armazenados em memória maximum_object_size_in_memory 8 KB Máscara de rede da sua rede client_netmask 255.255.255.0 Email do usuário do computador local que administra do squid cache_mgr admin@firewall.linuxbrasil.org.br usuário dono do squid cache_effective_user proxy (No Debian é proxy e no Red Hat / Fedora é squid) grupo dono do squid 7
cache_effective_group proxy (No Debian é proxy e no Red Hat / Fedora é squid) Nome do computador que está instalado o squid e onde será exibidas as mensagens de erro. visible_hostname firewall.linuxbrasil.org.br Diretório de erros do squid error_directory /usr/share/squid3/errors/english Para exibir os erros em português altere para: error_directory /usr/share/squid3/errors/portuguese Arquivos de logs de acesso e objetos do cache do squid access_log /var/log/squid3/access.log cache_log /var/log/squid3/cache.log cache_store_log /var/log/squid3/store.log Iniciando o squid Comandos do squid Debian # /etc/init.d/squid3 start 8
# /sbin/service squid start Fedora Verificando status do squid Com o comando netstat, podemos ver a porta e se o serviço está ativo. # netstat -nap grep ":3128" tcp 0 0 0.0.0.0:3128 0.0.0.0:* OUÇA 3914/(squid) Criando novo cache do squid As vezes o squid pode travar, e para tentar resolver o problema criando novos diretórios de cache, pare o squid e execute o comando: # /etc/init.d/squid3 stop # squid3 -z Reiniciando configurações do squid Caso você tenha feito algumas alteração no arquivo squid.conf, execute o comando com o squid executando: 9
# /etc/init.d/squid3 start # squid3 -k reconfigure Entrando em modo de depuração Para analizar erros você pode entrar em modo debug para fazer a depuração de possíveis erros, para isso execute os comandos abaixo: # squid3 -k debug e # squid3 -X Verificando logs do squid Para ver os erros do serviço do squid execute o comando: # tail -f /var/log/syslog Para ver os acessos do squid execute o comando: # tail -f /var/log/squid3/access.log Proxy transparente É um recurso utilizado pelo squid, onde não precisa configurar o proxy no navegador (onde é recomendado caso a rede tenha muitos computadores) e sim no próprio arquivo de configuração do squid squid.conf, onde os acessos aos sites são feitos pelo squid e 10
especificar controle de acesso. Para o squid operar como proxy transparente, é necessário que esteja no mesmo computador que está configurado como firewall e acessando a internet, onde serão implementadas regras para seu funcionamento. Para versões antigas anterior a versão 2.6 do squid era necessário editar o arquivo squid.conf e adicionar as seguintes linhas : httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on Agora em versões acima da 2.6, que nesta configuração estamos usando a versão 3.0.PRE5, execute o comando squid -v, e verifique a versão do seu squid além de exibir as diretivas de compilação na hora da instalação. # squid -v Para habilitar proxy transparente a partir da versão 2.6, basta mudar a linha: http_port 3128 E acrescentar a palavra transparent após a porta do squid http_port 3128 transparent 11
Após alterar o arquivo squid.conf, crie uma regra no seu arquivo de firewall utilizando o comando com iptables abaixo, onde eth1 é interface de rede da rede local. iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128 Agora verifique a saída do comando iptables -L -v -t nat e veja o o redirecionamento na interface eth1 através da porta 3128 do squid. # iptables -L -v -t nat Chain PREROUTING (policy ACCEPT 298 packets, 19416 bytes) pkts bytes target prot opt in out source destination 0 0 REDIRECT tcp -- eth1 any anywhere anywhere tcp dpt:www redir ports 3128 Para fazer um teste execute o comando tail -f /var/log/squid3/access.log, e acesse a internet de um computador da rede. # tail -f /var/log/squid3/access.log ACL - (Access Control Lists - Listas de controle de acesso) É uma lista de controle de acesso aos sites permitidos e não permitidos, onde podemos bloquear ou liberar um computador ou uma rede, bloquear ou liberar por sites, palavras, horários e etc. Entendo como o squid lê as ACLs 12
*OBS o squid lê linha por linha de cima para baixo do arquivo squid.conf, portanto as suas ACLs serão interpretadas dessa forma tomando cuidado na ordem das linhas do arquivo. Veja exemplos de ACLs abaixo: acl LIBERADOS src 192.168.1.2 192.168.1.3 acl BLOQUEADOS src 192.168.1.4 192.168.1.5 acl SITES_PERMITIDOS dstdomain.google.com.br.uol.com.br acl SITES_BLOQUEADOS dstdomain.orkut.com.jogos.com http_access allow LIBERADOS SITES_PERMITIDOS http_access deny BLOQUEADOS SITES_BLOQUEADOS Acima foram criadas 2 ACLs de endereços IP: LIBERADOS - com os endereços IP que podem acessar os sites que estão permitidos BLOQUEADOS - com os endereços IP que não podem acessar os sites que estão bloqueados Em seguida foram criadas 2 ACLs de sites: SITES_PERMITIDOS - com os sites que podem ser acessados SITES_BLOQUEADOS - com os sites que não podem ser acessados A linha http_access allow LIBERADOS SITES_PERMITIDOS, diz ao squid para permitir (allow) os endereços IP 192.168.1.2 e 192.168.1.3, acessarem os sites.google.com.br e.uol.com.br (repare um ponto., indicando qualquer nome de host para os domínios do google.com.br e uol.com.br). Em seguida a linha http_access deny BLOQUEADOS SITES_BLOQUEADOS, diz ao squid para negar (deny) os endereços IP 192.168.1.4 e 192.168.1.5, acessarem os sites.orkut.com.jogos.com (repare um ponto., indicando qualquer nome de host para os 13
domínios do orkut.com e jogos.com). A medida que aumentar o número de endereços IP e sites, é necessário criar uma lista em arquivos, como é mostrado mais abaixo nos exemplos de bloqueio de sites e palavras. Você pode adicionar as suas ACLs no arquivo squid.conf, abaixo da linha que está em comentário # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS. Permitindo um ou mais computadores acessar internet acl IP_PERMITIDO src 192.168.1.2 192.168.1.3/32 192.168.1.4/255.255.255.255 http_access allow IP_PERMITIDO Os computadores com endereço IP 192.168.1.2 192.168.1.3 192.168.1.4 estarão liberados para acessar a internet, e o restante bloqueado. *OBS Observe que o endereço IP 192.168.1.3 possui a máscara de rede no formato CIDR /32, pois possui 32 bits e o endereço 192.168.1.4 possui a máscara de rede 255.255.255.255 preenchendo todos os 4 campos do endereço IP. Permitindo uma ou mais redes de computadores acessar internet *OBS é obrigatório a máscara de rede no formato padrão 255.0.0.0, 255.255.0.0, 255.255.255.0 e etc ou formato CIDR /8, /16, /24 e etc. 14
acl REDE_PERMITIDA src 192.168.0.0/255.255.255.0 192.168.1.0/24 http_access allow REDE_PERMITIDA As redes com endereço 192.168.0.0 192.168.1.0 estarão liberadas para acessar a internet, e o restante bloqueado. Restringindo um ou mais computadores acessar internet acl rede 192.168.1.0/24 acl IP_BLOQUEADO src 192.168.1.2 192.168.1.3/32 192.168.1.4/255.255.255.255 http_access deny IP_BLOQUEADO http_access allow rede Os computadores com endereço IP 192.168.1.2, 192.168.1.3 e 192.168.1.4 estarão bloqueados para acessar a internet, e o restante da rede 192.168.1.0/24 estará liberada. Restringindo uma ou mais redes de computadores acessar internet *OBS é obrigatório a máscara de rede no formato padrão 255.0.0.0, 255.255.0.0, 255.255.255.0 e etc ou formato CIDR /8, /16, /24 e etc. acl rede 192.168.0.0/24 acl REDE_BLOQUEADA src 192.168.1.0/255.255.255.0 192.168.2.0/24 http_access deny REDE_BLOQUEADA http_access allow rede 15
As redes com endereço 192.168.1.0/255.255.255.0 192.168.2.0/24 estarão bloqueadas para acessar a internet, e a rede 192.168.0.0/24 liberada. Bloqueando sites acl rede src 192.168.1.0/24 acl SITES_BLOQUEADOS dstdomain /etc/squid3/sites_bloqueados http_access deny SITES_BLOQUEADOS http_access allow rede Este arquivo /etc/squid3/sites_bloqueados deve ser criado manualmente, e nele estarão os sites que serão bloqueados, sendo que cada sites deve estar um em cada linha. # touch /etc/squid3/sites_bloqueados Agora edite o arquivo e inclua os sites que deseja bloquear # nano /etc/squid3/sites_bloqueados Veja um exemplo do arquivo:.google.com.br.orkut.com 16
*OBS Não esqueça de colocar um ponto. no início do domínio Bloqueando palavras acl rede src 192.168.1.0/24 acl PALAVRAS_BLOQUEADAS url_regex -i /etc/squid3/palavras_bloqueadas http_access deny PALAVRAS_BLOQUEADAS http_access allow rede *OBS - A opção -i após a palavra url_regex, serve para tanto palavras maiúsculas e como minúsculas. Este arquivo /etc/squid3/palavras_bloqueadas deve ser criado manualmente, e nele estarão as palavras que serão bloqueadas, sendo que cada palavra deve estar uma em cada linha. # touch /etc/squid3/palavras_bloqueadas Agora edite o arquivo e inclua os sites que deseja bloquear # nano /etc/squid3/palavras_bloqueadas Veja um exemplo do arquivo: 17
jogos SEXO Bloqueando por horário *Obs O bloqueio por horário só funciona quando o squid estiver configurado como proxy transparente, portanto não funcionará com autenticação. Para bloquear por horário é utilizado o formato de dias em inglês após a palavra time da seguinte forma: Domingo Sunday (representado pela letras S) Segunda Monday (representado pela letras M) Terça Tuesday (representado pela letras T) Quarta Wednesday (representado pela letras W) Quinta Thursday (representado pela letras H) Sexta Friday (representado pela letras F) Sábado Saturday (representado pela letras A) acl REDE src 192.168.1.0/24 acl HORARIO_BLOQUEADO time MTWHF 08:00-18:00 http_access allow REDE HORARIO_BLOQUEADO http_access deny REDE Esta ACL irá bloquear a internet de segunda à sexta, das 08:00 às 18:00 para a rede REDE que foi criada acima com o endereço 192.168.1.0/24. Repare que a acl REDE está liberada 18
para acessar internet apenas nestes dias dias é horários, em seguida é bloqueada para outros dias e horários que não estejam especificados na acl HORARIO_BLOQUEADO. Bloqueando por extensão de arquivo acl REDE src 192.168.1.0/24 acl DOWNLOAD_BLOQUEADO url_regex -i /etc/squid3/download_bloqueado http_access deny DOWNLOAD_BLOQUEADO http_access allow rede *OBS - A opção -i após a palavra url_regex, serve para tanto palavras maiúsculas e como minúsculas. Este arquivo /etc/squid3/palavras_bloqueadas deve ser criado manualmente, e nele estarão as palavras que serão bloqueadas, sendo que cada palavra deve estar uma em cada linha. # touch /etc/squid3/download_bloqueado Agora edite o arquivo e inclua os sites que deseja bloquear # nano /etc/squid3/download_bloqueado Veja um exemplo do arquivo, onde bloqueia qualquer arquivo que tenha essas extensões:.*\.exe$ 19
.*\.tar.gz$.*\.avi$.*\.mp3$ Autenticação de usuários através do proxy squid * ATENÇÃO! 1. Autenticação pelo proxy não funciona junto com proxy transparente, sendo assim você terá que escolher entre as dois métodos: autenticação ou proxy transparente. 2. Para autenticação você terá que configurar o proxy em todas os computadores, e como proxy transparente não. 3. O bloqueio por horário não funcionará se a configuração for feita no navegador, sendo assim terá que configurar o squid como proxy transparente. Agora retire o comentário da seguinte linha no arquivo squid.conf, onde /usr/lib/squid3/ncsa_auth é programa de autenticação. auth_param basic program /usr/lib/squid3/ncsa_auth /usr/etc/passwd Altere o caminho para o arquivo de senha para o diretório de configuração do squid /etc/squid3 auth_param basic program /usr/lib/squid3/ncsa_auth /etc/squid3/passwd_squid Caso você mudar a mensagem da tela de autenticação, retire o comentário da linha: auth_param basic realm Squid proxy-caching web server 20
Altere para algo como: auth_param basic realm Squid proxy Autenticacao de usuarios Agora edite o arquivo squid.conf e acrescente as seguintes linhas na seção de ACLs : acl LOGIN proxy_auth REQUIRED http_access allow LOGIN Agora será necessário criar o arquivo de usuários e senhas com o comando htpasswd, que vem junto com o servidor web Apache, portanto se caso você não tenha o Apache instalado, instale-o: No Debian use apt-get e no Fedora yum: Debian # apt-get install apache2 # yum install httpd Fedora 21
Depois de instalado o apache, agora podemos utilizar o comando htpasswd, criar o arquivo de usuários e senhas e restringir o acesso a internet fazendo autenticação por usuário. # htpasswd -c /etc/squid3/passwd_squid aluno1 Agora é só digitar a senha para o usuário aluno1 A opção -c deve ser utilizada apenas na primeira vez que for criar o arquivo, na próxima vez que executar o comando para criar outro usuário, não será necessário. Pronto agora basta configurar os computadores da rede para utilizar o proxy squid. Configuração dos clientes no navegador para acessar a internet pelo squid Quando o squid está configurado com autenticação, e não como proxy transparente, os navegadores do computadores da rede deverão ser configurados para acessar a internet pelo proxy squid. Para configurar o proxy no Mozilla Firefox e semelhantes, clique em: Editar Preferências Avançado Rede Configurações Configuração manual de proxy Agora basta preencher os campos com o endereço IP do proxy, que neste caso é 192.168.1.1 e especificar a porta do squid 3128, como mostra as imagens abaixo. 22
23
24
Limpando o arquivo squid.conf Agora iremos criar o arquivo squid.conf limpo a partir do arquivo original, onde serão retiradas as linhas que estão sem comentários #. # cp squid.conf squid.conf.backup # egrep -v "^# ^$" squid.conf.backup > squid.conf Agora faça o download do arquivo de squid.conf no formatato.tar.gz e depois descompate-o. Download do arquivo conf Após ter feito alguma alteração no arquivo squid.conf, execute o comando: # squid3 -k reconfigure ou reinicie o squid Debian 25
# /etc/init.d/squid3 restart Fedora # /sbin/service squid restart Limpando o cache do squid Quando existe muitos computadores na rede, a quantidade de acessos aumentará o tamanho do cache do squid também. Portanto você terá que apagar os arquivos de acesso e de cache do diretório /var/spool/squid3/. Siga os passos a seguir para apagar os arquivos e em seguida é mostrado um script para fazer essa tarefa, baseado no Debian (podendo ser adaptado para qualquer distribuição Linux) que pode ser incluído como uma tarefa agendada em uma crontab. Remova os objetos(páginas de internet) de cache do squid # rm -rf /var/spool/squid3/* Remova os arquivos de log do squid # rm -rf /var/log/squid3/access.log # rm -rf /var/log/squid3/cache.log # rm -rf /var/log/squid3/store.log 26
Crie os arquivos em branco de log do squid # touch /var/log/squid3/access.log # touch /var/log/squid3/cache.log # touch /var/log/squid3/store.log Verifique as permissões e proprietário na sua distribuição Linux com o comando ls -l e altere o dono e o grupo # chown proxy.proxy /var/log/squid3/access.log # chown root.root /var/log/squid3/cache.log # chown proxy.proxy /var/log/squid3/store.log # chmod 640 /var/log/squid3/access.log # chmod 644 /var/log/squid3/cache.log # chmod 640 /var/log/squid3/store.log Crie um novo diretório de cache do squid # /etc/init.d/squid3 stop # /usr/sbin/squid3 -z Agora inicie o squid # /etc/init.d/squid3 start 27
Abaixo segue o script, onde você pode mudar sua permissão para executar, copiar e fazer suas alterações para sua distribuição Linux. Download do script #!/bin/sh # limpa_cache_squid.sh ################################################################ # script para limpar o cache do squid desenvolvido pelo Prof. Fernando Projeto Linux Brasil ################################################################ echo limpando cache squid!!! # removendo os objetos(páginas de internet) de cache do squid # tome cuidado, repare um asterístico *, indicando que irá remover apenas o conteúdo do dire rm -rf /var/spool/squid3/* # removendo os arquivos de log do squid rm -rf /var/log/squid3/access.log rm -rf /var/log/squid3/cache.log rm -rf /var/log/squid3/store.log # criando os arquivos em branco de log do squid touch /var/log/squid3/access.log touch /var/log/squid3/cache.log 28
touch /var/log/squid3/store.log # verifique as permissões e proprietário na sua distribuição Linux com o comando ls -l e altere chown proxy.proxy /var/log/squid3/access.log chown root.root /var/log/squid3/cache.log chown proxy.proxy /var/log/squid3/store.log chmod 640 /var/log/squid3/access.log chmod 644 /var/log/squid3/cache.log chmod 640 /var/log/squid3/store.log # Criando um novo diretório de cache do squid /etc/init.d/squid3 stop /usr/sbin/squid3 -z echo iniciando squid!!! /etc/init.d/squid3 start 29