Servidor proxy com Squid – Instalação e configuração

Post original em Viva o Linux

Autor: Rik <ric.galossi at gmail.com>Data: 28/07/2012

Instalação e configuração básica

Squid, um servidor de Proxy, 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 várias 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. Este tutorial é voltado à distribuições baseadas no Debian.

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 KORZOSacl 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

Depois, dê um:

# /etc/init.d/squid restart

…Que seu Squid já deve estar em pleno funcionamento.

Entendendo a configuração

Agora, precisamos descobrir para que serve cada uma destas 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: 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: Esta 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” contendo localhost.
  • acl SSL_ports port 443 563: Cria a ACL contendo 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

Incorporando – Adicionando o cache

 

Incorporando um pouco

Bem, depois que entendemos como funciona e para que serve essas linhas de configurações, vamos incorporar um pouco o nosso Squid.

Adicione as seguintes linhas em seu arquivo:

# 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.
hierarchy_stoplist CGI-bin ?# Define o caminho das páginas de erro do squid.
error_directory /usr/share/squid/errors/Portuguese

# Define o e-mail que vai aparecer na página de erro do Squid, assim o usuário terá mais informações para interagir com o responsável.
cache_mgr admin@seu_dominio.com.br

# Esta ACL é responsável por não armazenar conteúdo CGI em cache.
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY

Adicionando o cache

As próximas linhas são referentes às configurações do cache.

# Define a quantidade de memória RAM reservada para o uso do Squid.
cache_mem 64 MB# Esta linha é responsável por limitar o tamanho dos arquivos que serão armazenados no cache da memória RAM.
maximum_object_size_in_memory 64 KB

# Aqui definimos o tamanho máximo e mínimo respectivamente dos arquivos que serão armazenados no cache do HD.
maximum_object_size 512 MB
minimum_object_size 0 KB

# 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_swap_low 90
cache_swap_high 95

# 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_dir ufs /var/spool/squid 2048 16 256

# Define onde serão armazenados os registros de log do Squid.
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

Essas três últimas 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 exemplo).

Mas é importante lembrar que estas 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.

Depois, reinicie o Squid para ativar as configurações:

# /etc/init.d/squid restart
Criando e entendendo as ACLs

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 sequência 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 à massa.

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

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

Neste arquivo, iremos adicionar palavras que serão bloqueadas, como: sexo, porno…

# pico /etc/squid/palavras_bloqueadas.txt

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

# pico /etc/squid/sites_bloqueados.txt

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

# pico /etc/squid/redes_sociais.txt

Neste arquivo, iremos colocar os IPs das máquinas dos gerentes (e “daquela” estagiária que entrou semana passada…:)):

# pico /etc/squid/ips_liberados.txt

Lista de sites adultos: redtub, xvideos

# pico /etc/squid/sites_porno.txt

Este arquivo limita os tipos de arquivos que serão baixados, tudo que contiver neste arquivo será bloqueado. Exemplos: .avi$, .mp3$, .wmv$:

# pico /etc/squid/formato_arquivo.txt

Pronto, depois dos arquivos criados e preenchidos, é hora de criar as ACLs:

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 “\e acl formato_arquivo url_regex -i “/etc/squid/formato_arquivo.txt”
acl horario_almoco time 12:00-13:00http_access allow liberados
http_access allow redes_sociais horario_almoco
http_access deny redes_sociais
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 estas linhas no “squid.conf”, é só reiniciar para que elas entrem em vigor:

# /etc/init.d/squid restart

Agora, vamos entender o funcionamento destas ACLs. No exemplo acima, criamos um modelo meio que padrão, no primeiro “parágrafo” criamos as ACLs e no segundo, liberamos ou bloqueamos as mesmas de acordo com nossa política.

Vamos dissecar linha por linha:

  • acl rede_local src 192.168.0.0/24 -> Cria a ACL rede_local contendo a faixa de endereço da rede local.
  • acl palavras_bloqueadas url_regex -i “/etc/squid/palavras_bloqueadas.txt “ -> 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 “ -> Cria a ACL sites_bloqueados contendo os sites proibidos que estão no arquivo descrito.
  • acl redes_sociais url_regex -i “/etc/squid/redes_sociais.txt” -> Cria a ACL redes_sociais contendo os sites de redes sociais que estão no arquivo descrito.
  • acl liberados src “/etc/squid/ips_liberados.txt “ -> Cria a ACL liberados contendo endereços de IP que estão no arquivo descrito.
  • acl porno url_regex -i “/etc/squid/sites_porno.txt “ -> 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” -> 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 -> Cria a ACL horario_almoco do horário de meio dia há uma da tarde.

Aqui que a mágica acontece, a ordem sobre como você organiza as ACLs, é que faz toda a diferença, vamos lá:

http_access allow liberados

Aqui, nós liberamos acesso total para os IP’s que estiverem no arquivo que criamos anteriormente.

http_access allow redes_sociais horario_almoco
http_access deny redes_sociais

Nestas 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 aos sites que estiverem no arquivo criado dentro da ACL ‘sites_bloqueados’.

http_access deny palavras_bloqueadas

Bloqueia o acesso à palavras que estiverem no arquivo criado dentro da ACL ‘palavras_bloqueadas’.

http_access deny porno

Bloqueia o acesso aos sites pornos que estiverem no arquivo criado dentro da ACL ‘porno’.

http_access deny formato_arquivo

Bloqueia o acesso a downloads 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.
Configuração final

Bem pessoal, depois de tudo isso, vamos ver como ficou nosso arquivo “squid.conf”:

http_port 3128
visible_hostname KORZOSerror_directory /usr/share/squid/errors/Portuguese

hierarchy_stoplist CGI-bin ?

cache_mgr 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  horario_almoco
http_access deny redes_sociais
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 aí!

Espero que tenha ficado claro e que todos entendam. Qualquer coisa, é só deixar um comentário.

Artigo previamente publicado em:

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: