Instalando e Configurando Um Servidor Proxy com Squid
Autor: Marcelo | Publicado: 2014-04-05T23:45:00-03:00


Pessoal nesse artigo vou mostrar um pouco do Squid, um servidor de Proxy, ele trabalha como saída principal da rede, com isso podemos centralizar nosso foco em segurança (políticas de acesso, autenticação, etc.) em uma única máquina, o Squid trabalha com os principais protocolos da internet alguns deles são: HTTP, HTTPS, FTP.



O squid é um software livre licenciado pela GPL, sua utilização pode nos trazer varias vantagens como: Autenticação, Controle de Acesso, Cache, Controle Centralizado, Registros de Acesso, etc. Ele também atua como Proxy transparente evitando que usuários “espertinhos” possam burlar o controle de acesso. Bem chega de teoria e vamos começar o trabalho:

O Squid é formado de um único pacote, o que torna sua instalação extremamente fácil.

# apt-get install squid

Depois que instalamos o Squid vamos renomear o arquivo de configuração para criarmos um do zero.

# mv /etc/squid/squid.conf /etc/squid/squid.conf.orig
# pico /etc/squid/squid.conf

Vamos criar uma configuração básica no arquivo adicionando as seguintes linhas.

http_port 3128
visible_hostname KORZOS

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

acl redelocal src 192.168.0.0/24

http_access allow localhost
http_access allow redelocal
http_access deny all
Dê um:
# /etc/init.d/squid restart
Que seu squid já deve estar em pleno funcionamento.

Agora precisamos descobrir para que serve cada uma dessas linhas:

http_port 3128: Define em qual porta o Squid vai atuar, a porta default é a 3128 mas podemos definir qualquer outra porta.

visible_hostname KORZOS: &nbsp;Define o nome do servidor, lembre-se de substituir o “KORZOS” pelo nome do seu servidor.

acl all src 0.0.0.0/0.0.0.0: Essa linha cria uma acl, uma política de acesso com nome “all” contendo qualquer ip.

acl localhost src 127.0.0.1/255.255.255.255: Aqui criamos uma acl de nome “localhost” contend o localhost.

acl SSL_ports port 443 563: Cria a acl contend as portas que são utilizadas no protocolo HTTPS.

acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535: Cria a acl contendo as portas de diversos protocolos conhecidos na internet.

acl manager proto cache_object: Cria a acl manager do tipo proto.

acl purge method PURGE : Cria a acl manager do tipo method.

acl CONNECT method CONNECT: Cria a acl CONNECT também do tipo method.

http_access allow manager localhost: Libera a acl manager e localhost.

http_access deny manager : Bloqueia a acl manager.

http_access allow purge localhost: Libera a acl purge e localhost

http_access deny purge: Bloqueia a acl purge.

http_access deny !Safe_ports: Esta linha se torna bastante interessante pelo uso da “!”, pois ela bloqueia qualquer conexão que não contenha o conteúdo da acl Safe_Ports.

http_access deny CONNECT !SSL_ports: Bloqueia qualquer conexão que não esteja no conteúdo da acl SSL_ports.

acl redelocal src 192.168.0.0/24: Cria a acl redelocal contendo a faixa de endereço da rede.

http_access allow localhost: Libera a acl localhost.

http_access allow redelocal: Libera a acl redelocal.
http_access deny all: Bloqueia a acl all

Bem depois que entendemos como funciona e para que serve essas linhas de configurações &nbsp;vamos incorporar um pouco o nosso squid. Adicione as seguintes linhas em seu arquivo.

hierarchy_stoplist CGI-bin ?

Esta opção manda o squid buscar os dados diretamente na origem, ela é referente ao conteúdo dinâmico, se a url conter algum padrão aqui especificado ela irá direto a origem buscar o conteúdo.

error_directory /usr/share/squid/errors/Portuguese

Define o caminho das paginas de erro do squid.

cache_mgr &nbsp;admin@seu_dominio.com.br

Define o email que vai aparecer na página de erro do squid, assim o usuário terá mais informações para interagir com o responsavel.

acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY

Esta acl é responsável por não armazenar conteúdo CGI em cachê.

As próximas linhas são referente as configurações do cache.

cache_mem 64 MB

Define a quantidade de memória Ram reservada para o uso do squid.

maximum_object_size_in_memory 64 KB

Esta linha é responsável por limitar o tamanho dos arquivos que serão armazenados no cache da memória Ram.

maximum_object_size 512 MB
minimum_object_size 0 KB

Aqui definimos o tamanho máximo e mínimo respectivamente dos arquivos que serão armazenados no cache do HD.

cache_swap_low 90
cache_swap_high 95

Com essas duas linhas podemos definir a porcentagem de atualização do cache, estamos dizendo que quando o cache chegar em 95% o squid irá apagar os arquivos mais antigos até chegar a 90%.

cache_dir ufs /var/spool/squid 2048 16 256

Nessa linha conseguimos definir o tamanho e alguns parâmetros do cache feito em HD, a linha é composta por quatro valores, o 1º define o caminho do cache (/var/spool/squid), o 2º o tamanho que será alocado em Mb para o cache (2Gb), o 3º a quantidade de diretórios criados para o cache (16) e o 4º é o numero de subdiretórios que serão criados, se você possuir bastante espaço em disco e quiser armazenar os arquivos por mais tempo aumente a opção do tamanha do cache.

cache_access_log /var/log/squid/access.log

Define onde serão armazenados os registros de log do squid.

refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280

Essas três linhas definem o intervalo de atualização do cache, ou seja de quanto em quanto tempo o squid irá aguardar antes de verificar se algum arquivo em cache foi alterado em seu local original (um download ou uma pagina web por ex.), mas é importante lembrar que essas três linhas sempre terão que ser usadas em conjunto, se você omitir uma delas a configuração não entrará em vigor. O Squid faz uso destes valores para verificar se os objetos armazenados são os mais recentes ou há a necessidade de atualizá-los. Não há necessidade de mudança nestes valores

Dê um restart no squid para ativar as configurações:

# /etc/init.d/squid restart

Depois que demos um upgrade em nosso squid é hora de criar as políticas de acesso (os bloqueios), antes de começar é importante lembrar que o squid trabalha de forma hierárquica, ou seja ele lê as regras em uma sequencia lógica, se você diz que ele deve bloquear a url que contenha a palavra “sexo” e depois mandar liberar, a url continuará bloqueada pois quando ele se encaixa em uma determinada regra ele não “lê” as demais. Bem mãos a massa;

Obs: Nos exemplos a seguir utilizarei como exemplo somente as acl’s do tipo: src, time e time.

Por questão de organização é bom criar arquivos com o conteúdo a ser trabalho para não poluir o .conf

# pico /etc/squid/palavras_bloqueadas.txt

Nesse arquivo iremos adicionar palavras que serão bloqueadas, como: sexo, porno, putaria...

# pico /etc/squid/sites_bloqueados.txt

Nesse arquivo serão adicionados os sites que não terão acesso, como: 4shared.com, rapidshare.com, megavideo.com, filesonic.com

# pico /etc/squid/redes_sociais.txt

Aqui iremos colocar as redes sociais, como: facebook.com, orkut.com, twiter.com

# pico /etc/squid/ips_liberados.txt

Nesse arquivo iremos colocar os ips das máquinas dos gerentes (e daquela estagiaria gostosa que entrou semana passada... :)

# pico /etc/squid/sites_porno.txt

Lista de sites pornôs: redtub.com, xvideos.com

# pico /etc/squid/formato_arquivo.txt

Esse arquivo limita o tipo de arquivo que serão baixados, tudo que contiver nesse arquivo será bloqueado: .avi$, .mp3$, .wmv$

Pronto depois dos arquivos criados e preenchidos é hora de criar as acl’s:


acl rede_local src 192.168.0.0/24
acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt "
acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt "
acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt"
acl liberados src "/etc/squid/ips_liberados.txt "
acl porno url_regex -i "/etc/squid/sites_porno.txt "
acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt"
acl horario_almoco time 12:00-13:00

http_access allow liberados
http_access allow redes_sociais &nbsp;horario_almoco
http_access deny redes_sociais &nbsp; &nbsp; 
http_access deny sites_bloqueados
http_access deny palavras_bloqueadas
http_access deny porno
http_access deny formato_arquivo
http_access allow rede_local

Depois de adicionar essas linhas no squid.conf é so reiniciar para que elas entrar em vigor

# /etc/init.d/squid restart

Pessoal vamos entender o funcionamento dessas acl’s, no exemplo acima criamos um modelo meio que padrão, no primeiro “parágrafo” criamos as acl’s e no segundo liberamos ou bloqueamos as mesmas de acordo com nossa política, vamos dessecar linha por linha:

acl rede_local src 192.168.0.0/24 -&gt; Cria a acl rede_local &nbsp;contendo a faixa de endereço da rede local.

acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt " -&gt; Cria a acl palavras_bloqueadas contendo as palavras proibidas que estão no arquivo descrito.

acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt " -&gt; Cria a acl sites_bloqueados &nbsp;contendo os sites proibidos que estão no arquivo descrito.

acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt" -&gt; Cria a acl redes_sociais &nbsp;contendo os sites de redes sociais que estão no arquivo descrito.

acl liberados src "/etc/squid/ips_liberados.txt " -&gt; Cria a acl liberados contendo endereços de &nbsp;ip que estão no arquivo descrito.

acl porno url_regex -i "/etc/squid/sites_porno.txt " -&gt; Cria a acl porno contendo os sites pornôs que estão no arquivo descrito.

acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt" -&gt; Cria a acl formato_arquivo contendo os tipos de arquivos que serão bloqueados que estão no arquivo descrito.

acl horario_almoco time 12:00-13:00 -&gt; Cria a acl horario_almoco do horário de meio dia há uma da tarde.

Aqui que a mágica acontece, a ordem de como você organiza as acl’s é que faz toda a diferença, vamos lá.

http_access allow liberados

Aqui nos liberamos acesso total para os ip’s que estiverem no arquivo que criamos anteriormente.

http_access allow redes_sociais &nbsp;horario_almoco
http_access deny redes_sociais &nbsp; &nbsp; 

Nessas linhas permitimos que qualquer usuário acesse os sites de redes sociais que estiverem no arquivo que criamos dentro do horário de 12:00 as 13:00, após esse horário o acesso é bloqueado.

http_access deny sites_bloqueados

Bloqueia o acesso os sites que estiverem no arquivo criado dentro da acl sites_bloqueados.

http_access deny palavras_bloqueadas

Bloqueia o acesso a palavras que estiverem no arquivo criado dentro da acl palavras_bloqueadas.

http_access deny porno

Bloqueia o acesso os sites porno que estiverem no arquivo criado dentro da acl porno.

http_access deny formato_arquivo

Bloqueia o acesso a download que forem do tipo de arquivo contido no arquivo criado na acl formato_arquivo.

http_access allow rede_local

Se o acesso não se encaixou em nenhuma das regras acima e for proveniente da rede interna ele é liberado.

Bem pessoal depois de tudo isso vamos ver como ficou nosso squid.conf

http_port 3128
visible_hostname KORZOS

error_directory /usr/share/squid/errors/Portuguese

hierarchy_stoplist CGI-bin ?

cache_mgr &nbsp;admin@seu_dominio.com.br

acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

cache_mem 64 MB
maximum_object_size_in_memory 64 KB
maximum_object_size 512 MB
minimum_object_size 0 KB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /var/spool/squid 2048 16 256
cache_access_log /var/log/squid/access.log

refresh_pattern ^ftp: 15 20% 2280
refresh_pattern ^gopher: 15 0% 2280
refresh_pattern . 15 20% 2280

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

acl rede_local src 192.168.0.0/24
acl palavras_bloqueadas url_regex -i "/etc/squid/palavras_bloqueadas.txt"
acl sites_bloqueados url_regex -i "/etc/squid/ sites_bloqueados.txt"
acl redes_sociais url_regex -i "/etc/squid/redes_sociais.txt"
acl liberados src "/etc/squid/ips_liberados.txt"
acl porno url_regex -i "/etc/squid/sites_porno.txt"
acl formato_arquivo url_regex -i "/etc/squid/formato_arquivo.txt"
acl horario_almoco time 12:00-13:00

http_access allow liberados
http_access allow redes_sociais &nbsp;horario_almoco
http_access deny redes_sociais &nbsp; &nbsp; 
http_access deny sites_bloqueados
http_access deny palavras_bloqueadas
http_access deny porno
http_access deny formato_arquivo
http_access allow rede_local
http_access allow localhost

http_access deny all

Bem é isso ai espero que tenha ficado claro e que todos entendam, qualquer coisa é so deixar um comentário.



Fonte:Guia do TI