Simples Web Proxy no Debian com Squid

Squid é uma aplicação para proxy e cache web, podendo ser utilizado inclusive como proxy reverso.

Nesse exemplo vou mostrar como configurar um simples servidor de proxy utilizando o squid no debian (squeeze). Vale lembrar que o debian possuí duas versões do squid em seus repositórios e que esse tutorial foi baseado e testado na versão 3 do squid.


Instale o squid 

apt-get install squid3

O arquivo de configuração do squid fica em /etc/squid3/squid.conf  porém, se você visualizar este arquivo irá perceber que o mesmo possuí diversas linhas com comentários e poucas linhas com a configuração padrão do serviço. E por este motivo iremos criar um novo arquivo de configuração apenas com os parâmetros necessários para o funcionamento do squid, mas eu aconselho a leitura desses comentários pois praticamente toda configuração possível no squid está descrita com vários exemplos.

Renomeei o arquivo squid.conf para squid.conf.default

mv /etc/squid3/squid.conf /etc/squid3/squid.conf.default

Agora crie um novo arquivo squid.conf

vi /etc/squid3/squid.conf

E adicione o seguinte conteúdo 

#Squid Listen port 3128
http_port 3128

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1


acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

http_access allow localhost

# And finally deny all other access to this proxy
#http_access deny all

hierarchy_stoplist cgi-bin ?

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid3

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Todos esses parâmetros são as configurações padrão que estão no arquivo squid.conf.default, eu apenas removi os comentários e exemplos.

Percebam que no conteúdo que adicionamos existe o seguinte parâmetro comentado http_access deny all por padrão esse parâmetro está descomentado porém, seu comentei o mesmo pois ele bloqueia o acesso a qualquer endereço, ip ou domínio portanto no momento o acesso a qualquer endereço está liberado. Se o seu objetivo é bloquear o acesso a tudo e permitir que apenas alguns endereços possam ser acessados você deve descomentar esse parâmetro e depois adicionar a configuração de permissão de acesso para os endereços que você desejar, lembre-se sempre a configuração de bloqueio deve vir antes da configuração de liberação, com exceção para um caso que irei mostrar mais adiante. 

Agora embaixo desse conteúdo que adicionamos ao arquivo squid.conf, iremos adicionar a configuração customizada, como exemplo irei criar 3 regras de acesso, uma regra bloqueando determinadas palavras, outra regra bloqueando determinados domínios e uma regra permitindo o acesso a minha rede local.

Adicione o conteúdo abaixo no final do arquivo /etc/squid3/squid.conf

###########################
# Configuração Personalizada  #
###########################

#Bloqueados
acl dominios dstdomain  "/etc/squid3/dominios"
http_access deny dominios

acl palavras url_regex -i "/etc/squid3/palavras"
http_access deny palavras


#Rede Local 
acl redelocal src 7.7.7.1/8  #Substitua pelo ip da sua rede ex:192.168.0.1/32
http_access allow redelocal

Crie o arquivo dominios em /etc/squid3/

vi /etc/squid3/dominios

 E adicione os domínios a serem bloqueados (Um domínio por linha!!)

.facebook.com.br
.twitter.com.br

Crie o arquivo palavras

vi /etc/squid3/palavras

E adicione as palavras que serão bloqueadas
 
sexy
playboy
sexo
microsoft

Essa é a configuração necessária para bloquear uma lista de domínios, bloquear domínios que contenham a palavra definida na lista de palavras e liberar o acesso para os endereços da rede local.  A política de acesso do squid é baseada nas ACL que são definidas pelo nome, tipo e endereço ou listas de endereços que irão ser bloqueados ou liberados pelo comando http_access. 

Após a configuração e criação dos arquivos reinicie o squid 

/etc/init.d/squid3 restart

Vamos testar se nosso proxy está funcionando, utilize um navegador e o configure para utilizar o ip do seu servidor como proxy. Se estiver utilizando firefox vá em Preferências/Avançado/ selecione a aba Rede e clique em Configurar conexão


 Em HTTP: adicione o endereço ip do servidor onde você configurou o proxy na Porta 3128.

Após a configuração acesse algum site e perceba que irá conseguir navegar sem problemas, mas ao tentar acessar um site bloqueado ou que contenha uma palavra bloqueada em seu endereço  você irá se deparar com uma mensagem de acesso negado como o da imagem abaixo.

Tentando acessar o Facebook

Pesquisando a palavra microsoft
 

 Explicando a Configuração 

acl dominios dstdomain "/etc/squid3/dominios" - Aqui eu criei uma acl (Defini uma politica de acesso) identificada pelo nome de dominios do tipo dstdomain (Destino de Domínio) passando um arquivo que contém uma lista de domínios localizado no diretório /etc/squid3
lembrando que no arquivo você só pode informar um domínio por linha.

http_access deny dominios  - O http_access é quem dita as regras, ele pode permitir(allow) ou bloquear(deny) o acesso de uma acl. Nessa linha eu estou bloqueando o acesso a qualquer domínio que estiver contido dentro do arquivo dominios definido na acl nomeada dominios.

acl palavras url_regex -i "/etc/squid3/palavras"  - Criando a acl nomeada palavras, do tipo url_regex (expressão regular que irá casar com qualquer url que contenha a palavra definida na lista de palavras). O parâmetro -i serve para que a expressão regular não distinguir letras maiúsculas e minúsculas. E por fim passando o arquivo que contém as palavras que serão bloqueadas localizado em /etc/squid3.

http_access deny palavras - Bloqueia o acesso a qualquer url que contenha a palavra definida no arquivo /etc/squid3/palavras. 

acl redelocal src 7.7.7.1/8 - Criando a acl redelocal do tipo src(source) informando o ip da minha rede local e a máscara. Essa parte você deve substituir pelo ip da sua rede, que geralmente é 192.168.0.1 ou 10.0.0.1 e a máscara de rede, você pode informar a máscara desse modo também ex: 192.168.0.1/255.255.2555.0

http_access allow redelocal - Permite o acesso a rede local


 Exceção a Regra

Você deve estar achando que eu odeio muito a microsoft por adiciona-la na lista de palavras bloqueadas, bom eu não sou um grande fã da microsoft mas eu adicionei ela na lista de palavras bloqueadas para mostrar um exemplo. Anteriormente eu disse que sempre se deve criar a configuração de bloqueio antes da configuração de liberação, o que do ponto lógico faz sentido pois de que adianta liberarmos o acesso a um domínio e logo depois bloquear tudo, logo permissão de acesso ao domínio não será válida. 

 Se na configuração atual eu tentar acessar microsoft.com ou qualquer domínio que contenha a palavra microsoft eu não irei conseguir pois é uma palavra bloqueada, mas digamos que  eu queira que apenas o domínio microsoftstore.com seja liberado e os demais domínios que contenham a palavra microsoft seja bloqueado? É ai que entra a exceção a regra, devemos liberar o domínio microsoftstore.com antes de bloquear a palavra microsoft.

Então vamos adicionar a configuração de liberação no arquivo /etc/squid3/squid.conf



#########################
# Configuração Personalizada #
#########################

#Permite o acesso a domínios que contenham palavras bloqueadas
acl livre url_regex -i  "/etc/squid3/livre"
http_access allow livre

#Bloqueados
acl dominios dstdomain  "/etc/squid3/dominios"
http_access deny dominios

acl palavras url_regex -i "/etc/squid3/palavras"
http_access deny palavras


#Rede Local 
acl redelocal src 7.7.7.1/8  #Substitua pelo ip da sua rede ex:192.168.0.1/32
http_access allow redelocal

A parte em negrito foi a configuração adicional ao arquivo squid.conf, veja que é uma configuração de liberação de acesso que está sendo definida antes do bloqueio das palavras.

Crie o arquivo livre
 
vi /etc/squid3/livre

E adicione o domínio microsoftstore.com

 
.microsoftstore.com

Reinicie o squid 

 
/etc/init.d/squid3 restart

Agora tente acessar o site da microsoft ou algum domínio que contenha a palavra microsoft


Bloqueado como esperado, agora vamos tentar acessar  microsoftstore.com


Acesso total ao domínio microsoftstore.com, o único domínio autorizado que contenha a palavra microsoft.

Bom espero que esse post tenha sido útil para alguém, qualquer dúvida ou sugestão fique a vontade para comentar, lembrando que o arquivo squid.conf.default que renomeamos pode tirar várias dúvidas com vários exemplos nos comentários.

Deixe um comentário