A cada caractere inserido no squid.conf, lembre-se que o Squid lê as ACLs de cima para baixo e quando encontra alguma que se aplique, ele para. Parece meio complicado, mas funciona assim: 

Vou criar três ACLs: acesso_total, acesso_restrito e bloqueado. Estes arquivos terão os seguintes conteúdos:

  • acesso_total = IPs dos clientes que terão acesso total à internet. Não passarão por nenhuma restrição do Squid.
  • acesso_restrito = IPs dos clientes que passarão pelo bloqueio de sites estabelecido na acl seguinte.
  • bloqueado = Lista de palavras que o Squid bloqueará se forem encontradas na URL.

De posse destas três ACLs, vamos declará-las no squid.conf desta maneira: 

acl acesso_total src “/etc/squid/acesso_total”
acl acesso_restrito src “/etc/squid/acesso_restrito”
acl bloqueado url_regex -i “/etc/squid/bloqueado”
OBS: A opção -i encontrada na linha que declara o bloqueio serve para NÃO fazer distinção entre maiúsculas e minúsculas. 

Agora que as regras foram declaradas, vamos ativá-las dessa maneira: 

http_access allow acesso_total
http_access deny bloqueado
http_access allow acesso_restrito
http_access deny all
Como o Squid as lê: 

A primeira regra que o Squid lê (http_access allow acesso_total) diz que será LIBERADO acesso a quem estiver com o IP cadastrado no arquivo “/etc/squid/acesso_total”. Então, quem ele encontra aqui já é liberado e não passa mais pelas outras ACLs seguintes. Por isso o acesso é direto e total. 

A segunda regra que ele encontra (http_access deny bloqueado) diz que será NEGADO o acesso às URLs que coincidirem com as palavras que estão no arquivo “/etc/squid/bloqueado”. Se, por exemplo, neste arquivo tiver a palavra sexo, qualquer site que tenha esta palavra na sua URL não será acessado, como em www.uol.com.br/sexo, www.sexomais.com.br, etc. Mas atenção neste detalhe. O Squid vem lendo o arquivo de cima para baixo e só chegará a segunda regra quem não cair na primeira, ou seja quem não tiver o IP cadastrado no arquivo de acesso total. 

A terceira regra que o Squid lê (http_access allow acesso_restrito) diz que será LIBERADO acesso a quem tiver com o IP cadastrado no arquivo “/etc/squid/acesso_restrito”. Como na terceira regra só chega quem não caiu na regra anterior, o acesso pode ser liberado tranquilamente. 

A quarta e última regra (http_access deny all) nega o acesso a qualquer IP de qualquer máscara (0.0.0.0/0.0.0.0), pois ela já vem declarada no início das ACLs (acl all src 0.0.0.0/0.0.0.0). 

Você deve estar se perguntando: Mas como pode negar acesso a todos os IPs se tenho que liberar o meu? A resposta é simples e está no que eu enfatizei até agora. O segredo está na seqüência como o Squid lê as ACLs. 

Se ele lê a primeira (acesso_total) e ninguém se aplica a ela, então passará para a segunda. Se nesta também ninguém se aplica, ele passará para a terceira. É óbvio concluir que se o cliente não está cadastrado no acesso_total, nem está no acesso_restrito, então ele não faz parte da rede e deve ser bloqueado (deve ser algum espertinho mudando de IP, hehehe!!!). Só chegará a última quem não caiu em nenhuma das anteriores. Por isso, divida sua rede em quem pode ter acesso total e restrito e cadastre os clientes em seus respectivos arquivos. 

Agora que você já entendeu como funcionam as ACLs, vamos a um exemplo um mais complexo do que o anterior, mas não é complicado entender. 

Neste exemplo vamos montar uma rede baseada numa lista de bloqueios e exceções. Ou seja, o cliente só terá o seu acesso bloqueado se o site estiver previamente cadastrado na lista de bloqueios. 

A desvantagem desta montagem de acesso é que se o cliente conhecer sites semelhantes aos bloqueados (com URLs diferentes) poderá acessar. Fica então a critério do administrador da rede ter uma vasta lista do que não pode acessar. 

A regra deste tipo de restrição é: QUALQUER SITE É PERMITIDO, DESDE QUE NÃO ESTEJA NA LISTA. 

Veja um exemplo de uma rede funcionando assim: 

Arquivo: /etc/squid/acesso_total 

Conteúdo: 

192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
Descrição: Máquinas que terão acesso total à internet. 

Arquivo: /etc/squid/acesso_restrito 

Conteúdo: 

192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
Descrição: Máquinas que terão acesso restrito à internet. Passarão por bloqueios. 

Arquivo: /etc/squid/download 

Conteúdo: 

.exe$
.iso$
.avi$
.mp3$
.wmv$
.mpeg$
Descrição: Extensões de arquivos que terão download bloqueado. 

Arquivo: /etc/squid/bloqueado 

Conteúdo: 

sexo
hardcore
ninfeta
penis
suruba
playboy
revistasexy
Descrição: Palavras para restrição de URLs. 

Arquivo: /etc/squid/liberado 

Conteúdo: 

abcdasaude
sexoesaude
medicinanatural
uol.com.br/sexo
Descrição: Exceções aos bloqueios. O que for colocado aqui, mesmo que esteja na lista de bloqueios será liberado. 

Agora vamos à prática! 

Declare as ACLs: 

acl acesso_total src “/etc/squid/acesso_total”
acl acesso_restrito src “/etc/squid/acesso_restrito”
acl liberado url_regex -i “/etc/squid/liberado”
acl download url_regex -i “/etc/squid/download”
acl bloqueado url_regex -i “/etc/squid/bloqueado”
Depois de declarar, ative as ACLs na mesma seqüência do exemplo abaixo: 
http_access allow acesso_total
http_access allow liberado
http_access deny download
http_access deny bloqueado
http_access allow aceso_restrito
http_access deny all
Agora vamos às explicações e as análises dos casos. 

Caso 1 – O cliente com IP 192.168.1.2 vai acessar o site www.uol.com.br.
Por estar cadastrado no acesso total ele cairá logo na primeira regra e será LIBERADO o acesso a qualquer site. Nenhuma das regras seguintes serão aplicadas a ele tanto o uol.com.br como qualquer outra página estará liberada. 

Caso 2 – O cliente com IP 192.168.1.6 vai acessar o site www.uol.com.br.
Por estar no acesso restrito, ele “passará ileso” pela primeira regra. Encontrará então a segunda (liberado), que são as exceções dos bloqueios. Como o site www.uol.com.br não está na lista de exceções ele também passará ileso por esta regra. Chegará então, à terceira regra (download) que limita os downloads. Nesta também não encontrará nada, pois não estamos fazendo download de nenhum arquivo. Chegará então a quarta (bloqueado) e mais perigosa regra, mas como nela não tem nenhuma restrição para o site uol ele também passará ileso. Cairá então na quinta regra, onde o acesso ao seu IP (192.168.1.6) está LIBERADO (allow) podendo assim acessar o site www.uol.com.br. 

Caso 3 – O cliente com IP 192.168.1.6 vai acessar o site www.sexomais.com.br.
Por estar no acesso restrito, ele passa pela primeira regra. Encontrará a segunda, na qual há exceções para os bloqueios, mas não há nenhuma exceção para o site sexomais.com.br. Então ele prossegue, passando ileso pelo download e caindo na regra bloqueado, pois o site sexomais.com.br contém uma palavra (sexo) que está na lista de bloqueios. Mesmo estando cadastrado no acesso_restrito este cliente não chegará a acl que lhe dá permissão de acesso, pois antes ele já caiu no bloqueio de sites e (como já disse) o Squid para de ler quando aplica alguma regra. 

Caso 4 – O cliente com IP 192.168.1.6 vai acessar o site www.medicinanatural.com.br/sexo. (Mas que cara teimoso…)
Já sabemos que este cliente pulará a primeira regra, pois sei IP é do acesso restrito, mas cairá logo na segunda, onde há uma exceção para acessar todo o conteúdo do site medicinanatural. Mesmo que em sua URL (www.medicinanatural.com.br/sexo) tenha a palavra sexo, a regra de bloqueio não será aplicada, pois antes mesmo de chegar nela foi encontrada uma adequação na regra de exceções e o Squid parou de ler o resto das regras para este IP. 

Caso 5 – O cliente com IP 192.168.1.6 (coitado desse cara…) vai acessar o site www.superdownloads.com.br.
Ele pulará a primeira regra. Não se enquadrará na segunda, mas cairá na terceira se tentar fazer qualquer download de arquivos com extensões definidas na lista /etc/squid/download. Se não tentar fazer downloads, poderá navegar tranquilamente pelo site, afinal, não há nenhuma restrição para a URL dele. 

Espero que este exemplo tenha ficado claro. Na página seguinte montaremos um outro tipo de restrições de acesso.

Este tipo de rede é bem mais fácil montar que a anterior. NELA, TUDO É BLOQUEADO, EXCETO O QUE VOCÊ DEFINIR COMO EXCEÇÃO, ao contrário da outra que tudo é liberado, exceto o que você definir nos bloqueios. Sua vantagem é que o administrador da rede não precisa de uma enorme lista do que “não pode ser acessado”. Em alguns casos é mais fácil liberar apenas o que pode ser acessado do que bloquear tudo o que não poder ser acessado. A grande jogada esta aí! 

Vamos então a um exemplo prático. 

Arquivo: /etc/squid/acesso_total 

Conteúdo: 

192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
Descrição: Máquinas que terão acesso total à internet. 

Arquivo: /etc/squid/acesso_restrito 

Conteúdo: 

192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
Descrição: Máquinas que terão acesso restrito à internet. Passarão por bloqueios. 

Arquivo: /etc/squid/liberado 

Conteúdo: 

.gov.
.edu.
.org.
ufc
uece
unifor
minhaempresa.com.br
bb.com.br
bradesco.com.br
Descrição: Exceções aos bloqueios. 

Declare as ACLs: 

acl acesso_total src “/etc/squid/acesso_total”
acl acesso_restrito src “/etc/squid/acesso_restrito”
acl liberado url_regex -i “/etc/squid/liberado”
Ative as ACLs: 
http_access allow acesso_total
http_access allow liberado
http_access deny acesso_restrito
http_access deny all
Agora vamos ao estudo dos casos. A primeira regra LIBERA o acesso dos IPs cadastrados no acesso_total. A segunda regra libera o acesso apenas aos conteúdos do arquivo /etc/squid/liberado. E as demais negam os acessos da rede local e de todos os outros IPs também. 

Caso 1 – O cliente com IP 192.168.1.2 vai acessar o site www.uol.com.br.
Por estar cadastrado no acesso total ele cairá logo na primeira regra e será LIBERADO o acesso a qualquer site. Nenhuma das regras seguintes serão aplicadas a ele tanto o uol.com.br como qualquer outra página estará liberada. 

Caso 2 – O cliente com IP 192.168.1.6 vai acessar o site www.uol.com.br.
Por não estar no acesso total, ele pulará esta regra. Como não é nenhuma exceção para o site www.uol.com.br ele também passará ileso pela segunda regra. Da terceira em diante ele não faz mais nada, pois elas negam qualquer tipo de acesso. O site www.uol.com.br será bloqueado para este IP. 

Caso 3 – O cliente com IP 192.168.1.6 vai acessar o site www.detran.ce.gov.br.
Já sabemos que ele pulará a primeira regra. Encontrará então a segunda, que em sua lista possui (.gov.) uma referência à URL que ele está tentando acessar. Como a regra está liberando (allow) o acesso a qualquer URL que contenha .gov. o cliente poderá acessar normalmente todo o site www.detran.ce.gov.br. 

Como vimos este exemplo é bem mais simples que o anterior e a abrangência dos bloqueios é bem maior. É ideal para escolas, bancos e instituições públicas, onde o conteúdo da internet é altamente restrito. 

Na última página mostrarei como redirecionar as páginas (para um aviso por exemplo) quando o cliente cair em algum bloqueio. 

Depois de montada a rede com o modelo de sua preferência, falta apenas redirecionar as mensagens, afinal haverão inúmeras reclamações de clientes dizendo que estão sem internet e na verdade estão tendo seus sites bloqueados. Nada mais óbvio do que colocar um aviso informando isso, concorda? É bem simples. Vamos então à prática. 

Procure no seu squid.conf a linha error_directory. Ela informa o diretório onde o Squid vai buscar os arquivos HTML de erro. No meu conectiva, por exemplo, o referido diretório fica em /usr/share/squid/errors/Portuguese. 

1. Crie então uma página HTML comum informando que o usuário está tentando acessar um site proibido. 

2. Salve-a dentro do diretório informado acima para que o Squid a encontre quando alguém for bloqueado. 

Procure no squid.conf a linha deny_info. Nesta linha você define qual erro vai acionar qual página. Veja um exemplo: 

deny_info block.html bloqueado
Neste exemplo o cliente será redirecionado para a página block.html quando ocorrer algum bloqueio de sites. Você pode também acrescentar outras páginas de acordo com a quantidade de bloqueios que você possui. Para isso basta repetir as linhas, como no exemplo abaixo: 
deny_info block.html bloqueado
deny_info down.html download
deny_info all.html all
Se quiser também pode redirecionar para um site: 
deny_info http://www.google.com.br bloqueado.
Espero que este artigo possa ajudar alguém de alguma forma. Escrevi pensando no que eu queria ter encontrado quando estava aprendendo a usar as ACLs, por isso acho que deva ter alguma utilidade. Procurei exemplificar nos mínimos detalhes para não deixar nenhuma dúvida.