{"id":53,"date":"2010-07-26T15:31:20","date_gmt":"2010-07-26T18:31:20","guid":{"rendered":"http:\/\/blog.digavoip.com.br\/2010\/07\/26\/squid-6-parte-bloqueando-por-dominios-ou-palavras\/"},"modified":"2010-07-26T15:31:20","modified_gmt":"2010-07-26T18:31:20","slug":"squid-6-parte-bloqueando-por-dominios-ou-palavras","status":"publish","type":"post","link":"https:\/\/blog.abratel.com.br\/?p=53","title":{"rendered":"Squid &#8211; 6 parte &#8211; Bloqueando por dom\u00ednios ou palavras"},"content":{"rendered":"<p>Cr\u00e9ditos: Carlos E. Morimoto <\/p>\n<p>O Squid permite bloquear sites indesejados de forma bastante simples usando o par\u00e2metro &#8220;dstdomain&#8221;. Ele permite que voc\u00ea crie acl&#8217;s contendo endere\u00e7os de sites que devem ser bloqueados (ou permitidos). Isso \u00e9 feito em duas etapas. Primeiro voc\u00ea cria a acl, especificando os endere\u00e7os e, em seguida, usa o par\u00e2metro &#8220;http_access&#8221; para bloquear ou liberar o acesso a eles. Veja um exemplo:<br \/>\nacl bloqueados dstdomain orkut.com playboy.abril.com.br<br \/>\nhttp_access deny bloqueados<br \/>\nAqui eu criei uma acl chamada &#8220;bloqueados&#8221;, que cont\u00e9m os endere\u00e7os &#8220;orkut.com&#8221; e &#8220;playboy.abril.com.br&#8221; e em seguida usei o par\u00e2metro &#8220;http_access deny&#8221; para bloquear o acesso a eles. Voc\u00ea pode incluir diversas acls diferentes dentro da configura\u00e7\u00e3o do Squid, desde que use um nome diferente para cada uma. De certa forma, elas s\u00e3o similares \u00e0s vari\u00e1veis, que usamos ao programar em qualquer linguagem.<br \/>\nAo aplicar a regra, o Squid faz a resolu\u00e7\u00e3o do dom\u00ednio e passa a bloquear todas sub-p\u00e1ginas que estiverem hospedadas dentro dele. Existe uma ressalva: muitos sites podem ser acessados tanto com o &#8220;www&#8221; quanto sem. Se os dois estiverem hospedados em servidores diferentes, o Squid considerar\u00e1 que tratam-se de dois sites diferentes, de forma que ao bloquear apenas o &#8220;www.orkut.com&#8221; os usu\u00e1rios ainda conseguir\u00e3o acessar o site atrav\u00e9s do &#8220;orkut.com&#8221; e vice-versa. Nesses casos, para bloquear ambos, \u00e9 preciso incluir as duas possibilidades dentro da regra, como em:<br \/>\nacl bloqueados dstdomain orkut.com www.orkut.com playboy.abril.com.br<br \/>\nhttp_access deny bloqueados<br \/>\nVoc\u00ea pode incluir quantos dom\u00ednios quiser dentro da acl, basta separ\u00e1-los por espa\u00e7o e deixar tudo na mesma linha. Se a regra come\u00e7ar a ficar muito grande, voc\u00ea tem a op\u00e7\u00e3o de transferir as entradas para um arquivo. Nesse caso, crie um arquivo de texto simples, com todos os dom\u00ednios desejados (um por linha), como em:<br \/>\norkut.com<br \/>\nwww.orkut.com<br \/>\nplayboy.abril.com.br<br \/>\nwww.myspace.com<br \/>\n&#8230; e use a regra abaixo na configura\u00e7\u00e3o do Squid para que ele seja processado e os dom\u00ednios sejam inclu\u00eddos na acl. No exemplo, estou usando o arquivo &#8220;\/etc\/squid\/bloqueados&#8221;:<br \/>\nacl bloqueados url_regex -i &#8220;\/etc\/squid\/bloqueados&#8221;<br \/>\nhttp_access deny bloqueados<br \/>\nNaturalmente, n\u00e3o seria vi\u00e1vel tentar bloquear manualmente todos os sites pornogr\u00e1ficos, chats, comunidades online, e todos os outros tipos de sites que n\u00e3o s\u00e3o \u00fateis em um ambiente de trabalho. A id\u00e9ia seria logar os acessos (com a ajuda do Sarg, que veremos mais adiante) e bloquear os sites mais acessados, conforme tomar conhecimento deles. \u00c9 sempre uma corrida de gato e rato, mas, em se tratando de pessoas adultas, n\u00e3o h\u00e1 nada que uma boa conversa com o chefe n\u00e3o possa resolver. ;)<br \/>\nDe qualquer forma, em alguns ambientes pode ser mais f\u00e1cil bloquear inicialmente o acesso a todos os sites e ir abrindo o acesso a apenas alguns sites espec\u00edficos, conforme a necessidade. Neste caso, invertemos a l\u00f3gica 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:<br \/>\nacl permitidos url_regex -i &#8220;\/etc\/squid\/permitidos&#8221;<br \/>\nhttp_access allow permitidos<br \/>\nhttp_access deny all<br \/>\nNas vers\u00f5es recentes do Squid, ao bloquear um dom\u00ednio \u00e9 automaticamente bloqueado tamb\u00e9m o endere\u00e7o IP do servidor correspondente. Isso evita que os usu\u00e1rios da rede consigam burlar o proxy, acessando os sites diretamente pelo IP. De qualquer forma, voc\u00ea pode criar diretamente regras que bloqueiem determinados endere\u00e7os IP, o que \u00e9 \u00fatil em casos de servidores sem dom\u00ednio registrado, ou que respondam por v\u00e1rios dom\u00ednios. Nesse caso, a regra ficaria:<br \/>\nacl ips-bloqueados dst 200.234.21.23 200.212.15.45<br \/>\nhttp_access deny ips-bloqueados<br \/>\nVoc\u00ea pode descobrir rapidamente o endere\u00e7o IP de um determinado dom\u00ednio usando o comando &#8220;host&#8221;, como em:<br \/>\n$ host google.com<br \/>\ngoogle.com A 72.14.207.99<br \/>\ngoogle.com A 64.233.187.99<br \/>\ngoogle.com A 64.233.167.99<br \/>\nDepois de adicionar as novas regras, nosso arquivo de configura\u00e7\u00e3o ficaria assim:<br \/>\nhttp_port 3128<br \/>\nvisible_hostname gdh<br \/>\nerror_directory \/usr\/share\/squid\/errors\/Portuguese\/<br \/>\ncache_mem 64 MB<br \/>\nmaximum_object_size_in_memory 64 KB<br \/>\nmaximum_object_size 512 MB<br \/>\nminimum_object_size 0 KB<br \/>\ncache_swap_low 90<br \/>\ncache_swap_high 95<br \/>\ncache_dir ufs \/var\/spool\/squid 2048 16 256<br \/>\ncache_access_log \/var\/log\/squid\/access.log<br \/>\nrefresh_pattern ^ftp: 15 20% 2280<br \/>\nrefresh_pattern ^gopher: 15 0% 2280<br \/>\nrefresh_pattern . 15 20% 2280<br \/>\nacl all src 0.0.0.0\/0.0.0.0<br \/>\nacl manager proto cache_object<br \/>\nacl localhost src 127.0.0.1\/255.255.255.255<br \/>\nacl SSL_ports port 443 563<br \/>\nacl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535<br \/>\nacl purge method PURGE<br \/>\nacl CONNECT method CONNECT<br \/>\nhttp_access allow manager localhost<br \/>\nhttp_access deny manager<br \/>\nhttp_access allow purge localhost<br \/>\nhttp_access deny purge<br \/>\nhttp_access deny !Safe_ports<br \/>\nhttp_access deny CONNECT !SSL_ports<br \/>\nacl bloqueados url_regex -i &#8220;\/etc\/squid\/bloqueados&#8221;<br \/>\nhttp_access deny bloqueados<br \/>\nacl redelocal src 192.168.1.0\/24<br \/>\nhttp_access allow localhost<br \/>\nhttp_access allow redelocal<br \/>\nhttp_access deny all<br \/>\nVeja que coloquei as duas regras antes do &#8220;http_access allow redelocal&#8221;, que abre tudo para a rede local. Como o Squid processa as regras seq\u00fcencialmente, as p\u00e1ginas que forem bloqueadas pela acl &#8220;bloqueados&#8221; n\u00e3o chegam a passar pela regra que autoriza os acessos provenientes da rede local.<br \/>\nUma segunda possibilidade \u00e9 usar o par\u00e2metro &#8220;dstdom_regex&#8221;, que permite bloquear sites de uma forma mais geral, com base em palavras inclu\u00eddas na URL de acesso. Voc\u00ea pode bloquear todas as p\u00e1ginas cujo endere\u00e7o inclua a palavra &#8220;sexo&#8221; ou &#8220;orkut&#8221;, por exemplo. Note que, ao usar esta regra, o Squid verifica a exist\u00eancia das palavras apenas na URL do site e n\u00e3o no conte\u00fado da p\u00e1gina. Para criar filtros baseados no conte\u00fado, voc\u00ea pode utilizar o DansGuardian, que veremos mais adiante.<br \/>\nCrie mais um arquivo de texto, contendo as palavras que devem ser bloqueadas, uma por linha, como em:<br \/>\norkut<br \/>\nxxx<br \/>\nsexo<br \/>\nteens<br \/>\nwarez<br \/>\n&#8230; e adicione a regra abaixo, contendo a localiza\u00e7\u00e3o do arquivo:<br \/>\nacl palavrasproibidas dstdom_regex &#8220;\/etc\/squid\/palavrasproibidas&#8221;<br \/>\nhttp_access deny palavrasproibidas<br \/>\nO uso desta regra \u00e9 um pouco mais problem\u00e1tico, pois bloquear\u00e1 todas p\u00e1ginas que contenham qualquer uma das palavras listadas na URL. Esta op\u00e7\u00e3o sempre levar\u00e1 a alguns falsos positivos e por isso deve ser usada com mais cuidado.<br \/>\nUma vantagem \u00e9 que ela permite bloquear facilmente p\u00e1ginas din\u00e2micas, onde a palavra \u00e9 passada como par\u00e2metro da URL. Um exemplo \u00e9 o Orkut, onde, depois da transfer\u00eancia para o Google, os dom\u00ednios principais passaram a encaminhar para URLs din\u00e2micas dentro do dom\u00ednio do Google, como em:<br \/>\nhttps:\/\/www.google.com\/accounts\/ServiceLogin?service=orkut&#038;continue=http%3A%2F%2Fwww.orkut.com<br \/>\n%2FRedirLogin.aspx%3Fmsg%3D0%26page%3Dhttp%253A%252F%252F<br \/>\nwww.orkut.com%252FHome.aspx&#038;hl=pt-BR&#038;rm=false&#038;passive=true<br \/>\nVoc\u00ea n\u00e3o poderia simplesmente bloquear o dom\u00ednio &#8220;google.com&#8221; usando uma regra url_regex, mas poderia muito bem usar o dstdom_regex para bloquear a palavra &#8220;orkut&#8221; e assim bloquear o acesso ao site sem bloquear o acesso a outros servi\u00e7os do Google.<br \/>\nN\u00e3o existe problema em combinar o bloqueio de dom\u00ednios e de palavras dentro da URL, voc\u00ea pode lan\u00e7ar m\u00e3o de uma combina\u00e7\u00e3o das duas coisas, de acordo com a situa\u00e7\u00e3o. Para isso, basta usar as duas regras simultaneamente, como em:<br \/>\nacl bloqueados url_regex -i &#8220;\/etc\/squid\/bloqueados&#8221;<br \/>\nhttp_access deny bloqueados<br \/>\nacl palavrasproibidas dstdom_regex &#8220;\/etc\/squid\/palavrasproibidas&#8221;<br \/>\nhttp_access deny palavrasproibidas<br \/>\nacl redelocal src 192.168.1.0\/24<br \/>\nhttp_access allow localhost<br \/>\nhttp_access allow redelocal<br \/>\nhttp_access deny all<br \/>\nInclu\u00eddas as regras, os clientes passam a ver uma mensagem de erro ao tentar acessar p\u00e1ginas que se enquadrem nos bloqueios:<\/p>\n<p>Por padr\u00e3o, as mensagens de erro aparecerem em ingl\u00eas. No nosso caso elas est\u00e3o aparecendo em portugu\u00eas devido \u00e0 linha &#8220;error_directory \/usr\/share\/squid\/errors\/Portuguese\/&#8221; que inclu\u00ed no modelo de configura\u00e7\u00e3o anterior.<br \/>\nVoc\u00ea pode personalizar as p\u00e1ginas de erro editando os arquivos dentro da pasta &#8220;\/usr\/share\/squid\/errors\/Portuguese&#8221; ou &#8220;\/usr\/share\/squid\/errors\/English&#8221; (de acordo com a l\u00edngua definida na configura\u00e7\u00e3o). A pasta cont\u00eam v\u00e1rias p\u00e1ginas html, uma para cada tipo de erro indicado. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cr\u00e9ditos: Carlos E. Morimoto O Squid permite bloquear sites indesejados de forma bastante simples usando o par\u00e2metro &#8220;dstdomain&#8221;. Ele permite que voc\u00ea crie acl&#8217;s contendo endere\u00e7os de sites que devem ser bloqueados (ou permitidos). Isso \u00e9 feito em duas etapas. Primeiro voc\u00ea cria a acl,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/53"}],"collection":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=53"}],"version-history":[{"count":0,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/53\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=53"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=53"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=53"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}