-Servidores Proxy (Squid) - Bloqueando por domínios ou palavras
Autor: Gilberto | Publicado: 2008-07-14T10:30:00-07:00

O Squid permite bloquear sites indesejados de forma bastante simples usando o parâmetro "dstdomain". Ele permite que você crie acl's contendo endereços de sites que devem ser bloqueados (ou permitidos). Isso é feito em duas etapas. Primeiro você cria a acl, especificando os endereços e, em seguida, usa o parâmetro "http_access" para bloquear ou liberar o acesso a eles. Veja um exemplo:  acl bloqueados dstdomain orkut.com playboy.abril.com.brhttp_access deny bloqueados  Aqui eu criei uma acl chamada "bloqueados", que contém os endereços "orkut.com" e "playboy.abril.com.br" e em seguida usei o parâmetro "http_access deny" para bloquear o acesso a eles. Você pode incluir diversas acls diferentes dentro da configuração do Squid, desde que use um nome diferente para cada uma. De certa forma, elas são similares às variáveis, que usamos ao programar em qualquer linguagem.  Ao aplicar a regra, o Squid faz a resolução do domínio e passa a bloquear todas sub-páginas que estiverem hospedadas dentro dele. Existe uma ressalva: muitos sites podem ser acessados tanto com o "www" quanto sem. Se os dois estiverem hospedados em servidores diferentes, o Squid considerará que tratam-se de dois sites diferentes, de forma que ao bloquear apenas o "www.orkut.com" os usuários ainda conseguirão acessar o site através do "orkut.com" e vice-versa. Nesses casos, para bloquear ambos, é preciso incluir as duas possibilidades dentro da regra, como em:   acl bloqueados dstdomain orkut.com www.orkut.com playboy.abril.com.brhttp_access deny bloqueados  Você pode incluir quantos domínios quiser dentro da acl, basta separá-los por espaço e deixar tudo na mesma linha. Se a regra começar a ficar muito grande, você tem a opção de transferir as entradas para um arquivo. Nesse caso, crie um arquivo de texto simples, com todos os domínios desejados (um por linha), como em:  orkut.comwww.orkut.complayboy.abril.com.brwww.myspace.com   ... e use a regra abaixo na configuração do Squid para que ele seja processado e os domínios sejam incluídos na acl. No exemplo, estou usando o arquivo "/etc/squid/bloqueados":   acl bloqueados url_regex -i "/etc/squid/bloqueados"http_access deny bloqueados  Naturalmente, não seria viável tentar bloquear manualmente todos os sites pornográficos, chats, comunidades online, e todos os outros tipos de sites que não são úteis em um ambiente de trabalho. A idéia seria logar os acessos (com a ajuda do Sarg, que veremos mais adiante) e bloquear os sites mais acessados, conforme tomar conhecimento deles. É sempre uma corrida de gato e rato, mas, em se tratando de pessoas adultas, não há nada que uma boa conversa com o chefe não possa resolver. ;)   De qualquer forma, em alguns ambientes pode ser mais fácil bloquear inicialmente o acesso a todos os sites e ir abrindo o acesso a apenas alguns sites específicos, conforme a necessidade. Neste caso, invertemos a lógica da regra. Criamos um arquivo com sites permitidos, adicionamos a regra que permite o acesso a eles e em seguida bloqueamos o acesso a todos os demais, como neste exemplo:   acl permitidos url_regex -i "/etc/squid/permitidos"http_access allow permitidoshttp_access deny all  Nas versões recentes do Squid, ao bloquear um domínio é automaticamente bloqueado também o endereço IP do servidor correspondente. Isso evita que os usuários da rede consigam burlar o proxy, acessando os sites diretamente pelo IP. De qualquer forma, você pode criar diretamente regras que bloqueiem determinados endereços IP, o que é útil em casos de servidores sem domínio registrado, ou que respondam por vários domínios. Nesse caso, a regra ficaria:  acl ips-bloqueados dst 200.234.21.23 200.212.15.45http_access deny ips-bloqueados   Você pode descobrir rapidamente o endereço IP de um determinado domínio usando o comando "host", como em:  $ host google.com  google.com A 72.14.207.99google.com A 64.233.187.99google.com A 64.233.167.99  Depois de adicionar as novas regras, nosso arquivo de configuração ficaria assim:  http_port 3128visible_hostname gdherror_directory /usr/share/squid/errors/Portuguese/  cache_mem 64 MBmaximum_object_size_in_memory 64 KBmaximum_object_size 512 MBminimum_object_size 0 KBcache_swap_low 90cache_swap_high 95cache_dir ufs /var/spool/squid 2048 16 256cache_access_log /var/log/squid/access.logrefresh_pattern ^ftp: 15 20% 2280refresh_pattern ^gopher: 15 0% 2280refresh_pattern . 15 20% 2280  acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objectacl localhost src 127.0.0.1/255.255.255.255acl SSL_ports port 443 563acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535acl purge method PURGEacl CONNECT method CONNECT  http_access allow manager localhosthttp_access deny managerhttp_access allow purge localhosthttp_access deny purgehttp_access deny !Safe_portshttp_access deny CONNECT !SSL_ports  acl bloqueados url_regex -i "/etc/squid/bloqueados"http_access deny bloqueados  acl redelocal src 192.168.1.0/24http_access allow localhosthttp_access allow redelocalhttp_access deny all  Veja que coloquei as duas regras antes do "http_access allow redelocal", que abre tudo para a rede local. Como o Squid processa as regras seqüencialmente, as páginas que forem bloqueadas pela acl "bloqueados" não chegam a passar pela regra que autoriza os acessos provenientes da rede local.   Uma segunda possibilidade é usar o parâmetro "dstdom_regex", que permite bloquear sites de uma forma mais geral, com base em palavras incluídas na URL de acesso. Você pode bloquear todas as páginas cujo endereço inclua a palavra "sexo" ou "orkut", por exemplo. Note que, ao usar esta regra, o Squid verifica a existência das palavras apenas na URL do site e não no conteúdo da página. Para criar filtros baseados no conteúdo, você pode utilizar o DansGuardian, que veremos mais adiante.   Crie mais um arquivo de texto, contendo as palavras que devem ser bloqueadas, uma por linha, como em:  orkutxxxsexoteenswarez  ... e adicione a regra abaixo, contendo a localização do arquivo:  acl palavrasproibidas dstdom_regex "/etc/squid/palavrasproibidas"http_access deny palavrasproibidas  O uso desta regra é um pouco mais problemático, pois bloqueará todas páginas que contenham qualquer uma das palavras listadas na URL. Esta opção sempre levará a alguns falsos positivos e por isso deve ser usada com mais cuidado.   Uma vantagem é que ela permite bloquear facilmente páginas dinâmicas, onde a palavra é passada como parâmetro da URL. Um exemplo é o Orkut, onde, depois da transferência para o Google, os domínios principais passaram a encaminhar para URLs dinâmicas dentro do domínio do Google, como em:   https://www.google.com/accounts/ServiceLogin?service=orkut&amp;continue=http%3A%2F%2Fwww.orkut.com%2FRedirLogin.aspx%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fwww.orkut.com%252FHome.aspx&amp;hl=pt-BR&amp;rm=false&amp;passive=true  Você não poderia simplesmente bloquear o domínio "google.com" usando uma regra url_regex, mas poderia muito bem usar o dstdom_regex para bloquear a palavra "orkut" e assim bloquear o acesso ao site sem bloquear o acesso a outros serviços do Google.   Não existe problema em combinar o bloqueio de domínios e de palavras dentro da URL, você pode lançar mão de uma combinação das duas coisas, de acordo com a situação. Para isso, basta usar as duas regras simultaneamente, como em:  acl bloqueados url_regex -i "/etc/squid/bloqueados"http_access deny bloqueados  acl palavrasproibidas dstdom_regex "/etc/squid/palavrasproibidas"http_access deny palavrasproibidas  acl redelocal src 192.168.1.0/24http_access allow localhosthttp_access allow redelocalhttp_access deny all  Incluídas as regras, os clientes passam a ver uma mensagem de erro ao tentar acessar páginas que se enquadrem nos bloqueios:  Por padrão, as mensagens de erro aparecerem em inglês. No nosso caso elas estão aparecendo em português devido à linha "error_directory /usr/share/squid/errors/Portuguese/" que incluí no modelo de configuração anterior.  Você pode personalizar as páginas de erro editando os arquivos dentro da pasta "/usr/share/squid/errors/Portuguese" ou "/usr/share/squid/errors/English" (de acordo com a língua definida na configuração). A pasta contêm várias páginas html, uma para cada tipo de erro indicado.