Squid

De Biblioteca Unix

Conteúdo

Squid

Sobre

O Squid é um software feito para fazer proxy de web e ftp, suporta cache, autenticação simples, ntlm, ldap, dentre outros.

Estrutura

Essa é a estrutura esperada para nosso servidor de Proxy:

  REDE LAN
     ||
     \/
 Proxy Squid (IP_LAN:3128)
     ||
     \/
  REDE WAN

note que o Squid fuciona tanto como um sistema de cache para melhorar a eficiência da navegação de Internet sem a necessidade de redownload, bem como um filtro para evitar a navegação por sites proibidos na sua rede.

Debian Lenny 5.0

Instalando os Pacotes necessários

No Debian Lenny temos 2 pacotes que fornecem o Squid, o pacote: squid e o pacote squid3, o que muda no caso é a versão e fica a gosto de quem está configurando, vamos instalar o mais estável:

# apt-get install squid

feito isso, o Proxy já deve estar executando e escutando a porta 3128 (padrão).

Configurações

Proxy Transparente

Quem apenas precisa que os sejam realizados filtros sem autenticação a forma mais rápida e torná-lo transparente e redirecionar o tráfego da porta http (80) para a porta proxy (3128). No Squid altere apenas a linha abaixo:

http_port 3128

e adicione:

http_port 3128 transparent

basta reiniciar o serviço e já teremos nosso Proxy transparente, falta agora redirecionar o tráfego, a regra do Iptables abaixo faz o serviço:

# iptables -t nat -A PREROUTING -p tcp --dport http -j REDIRECT --to-port 3128

pronto, nosso tráfego está sendo redirecionado.

Autenticação no LDAP

Nosso Proxy está bem simples e restringe apenas algumas páginas, nosso objetivo agora é liberar mediante senha sites, mas os usuários e senhas correspondentes estão em uma base OpenLDAP.

Primeiro é necessário checar se nosso Proxy se conecta no servidor LDAP:

# /usr/lib/squid/ldap_auth -D "cn=admin,dc=exemplo,dc=com,dc=br" -w SENHA \
    -b "dc=exemplo,dc=com,dc=br" -s sub -f "uid=%s" -h servidorldap.exemplo.com.br -v 3

vai ficar a linha em branco, você deve digitar:

USUARIO SENHA

com espaço entre usuário e senha, a saída depois que der ENTER deve ser:

OK

agora vamos editar o /etc/squid/squid.conf e colocar a linha que vai chamar a conexão com o OpenLDAP:

auth_param basic program /usr/lib/squid/ldap_auth -D "cn=admin,dc=exemplo,dc=com,dc=br" \ 
   -w SENHA -b "dc=exemplo,dc=com,dc=br" -s sub -f "uid=%s" -h servidorldap.exemplo.com.br -v 3
acl ldapauth proxy_auth REQUIRED
http_access allow ldapauth

quando você quiser que uma regra bloqueada seja acessada pelo usuário do OpenLDAP:

acl blocked-sites url_regex -i "/etc/squid/blocked-sites"
http_access deny blocked-sites !ldapauth

que vai bloquear os sites que estão no arquivo blocked-sites, e vai pedir senha para liberar caso seja um usuário autenticado positivamente no OpenLDAP.

Armazenando as ACLs do Squid no PostgreSQL

Estamos tendo problemas com centralização das regras dos servidores deu Proxy, pensando nisso, a centralização seria a melhor solução para:

  1. Centalizar regras de todos os Proxys
  2. Retirar as regras de arquivo e colocar em Banco

para que isso funcione vamos usar a regra external_acl_type que nos permite usar um script em shell para buscar as regras e é assim que vamos fazer as consultas no banco.

Vamos criar este script primeiro:

#!/bin/bash
export PGPASSWORD="SENHA"

while read url
do
CMD=$(echo "select domain from ${1} where '${url}' ilike '%' || domain || '%';" \
                                          | psql --username=USUARIO -h ENDERECO_HOST -p 5432 -d BANCO_DE_DADOS \
                                          | egrep -v "domain|^-|^\(|^$" | sed -e "s/ //g")
if [ $CMD ]
then
	echo "OK"
else
	echo "ERR"
fi
done

e as regras de acls:

external_acl_type sql_porn_domain %DST /etc/squid/modulo/sql-consult.sh TABELA
acl porn_domain external sql_porn_domain

agora basta definir que esta acl é bloqueada:

http_access deny porn_domain

pronto, suas regras vão ficar no banco de dados.

Criando o Banco de Dados para Armazenar as ACLs

Apenas para ficar bem completo, o script que criamos lê seguinte banco de dados:

CREATE SEQUENCE NOME_seq;
CREATE TABLE  NOME(
   id          integer PRIMARY KEY DEFAULT nextval('NOME_seq'),
   domain      CHAR(100) UNIQUE NOT NULL
); 

agora basta cadastrar os sites com o SQL:

INSERT INTO NOME(domain) VALUES ('dominio.com');

pronto, nossa centralização com banco de dados para o Proxy está pronto.

Ativando o Escaneamento de Vírus em Tempo Real

Como estamos usando o Clamav mais recente que está no Volatile do Debian, o HaVP correspondente no repositório Stable não funciona mais, por isso fizemos um backport do Squeeze para o Lenny. Primeiro baixe o pacote correspondente a sua arquitetura:

vamos instalá-lo:

# dpkg -i Havp_0.91-1.1_i386.deb

feito isso, se ele der algum erro por falta de dependências resolva com o comando:

# apt-get -f install

a configuração do HaVP é simples, veja seu arquivo de configuração:

SERVERNUMBER 40
MAXSERVERS 100
ACCESSLOG /var/log/havp/access.log
ERRORLOG /var/log/havp/havp.log
LOG_OKS false
TEMPDIR /var/tmp
TRANSPARENT false
PARENTPROXY localhost
PARENTPORT 3128
FORWARDED_IP true
PORT 8080
BIND_ADDRESS 127.0.0.1
TEMPLATEPATH /etc/havp/templates/br
SCANIMAGES false
MAXSCANSIZE 5000000
KEEPBACKBUFFER 200000
ENABLECLAMLIB true
ENABLECLAMD false

tem diversos outros módulos de suporte aos antivirus proprietários, mas como todos estarão desabilitados omitimos na configuração. O número definido em ServerNumber tem a ver com a quantidade de máquinas atrás do seu servidor de Proxy, para quantidades superiores a 500 computadores, 40 é o recomendado.

No Squid devemos colocar a seguinte entrada:

acl HTTP proto HTTP
cache_peer 127.0.0.1 parent 8080 0 no-query no-digest no-netdb-exchange default
cache_peer_access 127.0.0.1 allow all
always_direct deny localnet HTTP
always_direct allow all
never_direct allow localnet HTTP
never_direct deny all

onde localnet são as redes privadas da sua rede local.

Aumentando as Chances de HIT

Existe um pacote no Debian Lenny que ajuda o Squid conforme o usuário vai navegando na Internet, o Prefetch vai buscando os links seguintes e com isso quando o usuário entrar já vai estar no seu Proxy, isso da a impressão ao usuário que o acesso foi mais rápido, mas com isso você aumenta um pouco o processamento no servidor e também não vale a pena se seu espaço para cache é pequeno. Vamos instalar o pacote então:

# apt-get install squid-prefetch

o seu arquivo de configuração está em: /etc/squid-prefetch.conf, veja como ficou nossa configuração para um bom funcionamento com o Proxy configurado:

 squid_config_file /etc/squid/squid.conf
 http_host 127.0.0.1
 http_port 3128
 max_history_size 5000
 max_history_age 86400
 prefetch_regex http://.*(\.(html?|te?xt)|/[^\.]*)
 prefetch_options 0
 prefetch_fragments 1
 prefetch_maxsize 65536
 prefetch_cross 0
 

basta reinicializar o serviço e deixar o Prefetch cachear as páginas para você:

# /etc/init.d/squid-prefetch restart

pronto, nosso usuário agora vai ter uma impressão de navegação mais rápida.

Observações

Por algum motivo o Squid3 que está disponível no Stable do Debian Lenny não funciona com o HaVP e nem com nosso backport e as configurações de cache do Youtube também apresentam problemas.


--Brivaldo 16h58min de 21 de novembro de 2010 (UTC)

Ferramentas pessoais