ct

    Guia: Compartilhando a conexão e configurando o Squid


     Carlos E. Morimoto
     20/11/2006


    Adicionando restrições de acesso


    Em um ambiente de trabalho, a idéia é que os funcionários usem a internet para comunicação, pesquisa e outras funções relacionadas ao que estão fazendo. Muitas empresas permitem que acessem os e-mails pessoais e coisas do gênero, mas sempre até um certo limite. Seu chefe não vai gostar se começarem a passar a maior parte do tempo no Orkut, por exemplo.


    Bloqueando por domínios ou palavras


    O Squid permite bloquear sites indesejados de forma relativamente simples, onde você inclui na configuração uma acl contendo os sites não permitidos e cria uma política de acesso que bloqueia o acesso a eles.

    Isso é feito usando o parâmetro "dstdomain" (destination domain). Veja um exemplo:

    acl bloqueados dstdomain orkut.com playboy.abril.com.br
    http_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, incluí a regra "http_access deny bloqueados", que bloqueia o acesso a eles. Ao aplicar a regra, o Squid faz a resolução do domínio e passa a bloquear todas sub-páginas.

    Existe uma ressalva: muitos sites podem ser acessados tanto com o "www" quanto sem. Para o Squid, "www.orkut.com" e "orkut.com" são duas coisas diferentes. Bloqueando o "orkut.com" os usuários ainda conseguirão acessar o site através do "www.orkut.com" e vice-versa. Para bloquear ambos, é preciso incluir as duas possibilidades dentro da regra, como em:

    acl bloqueados dstdomain orkut.com www.orkut.com playboy.abril.com.br
    http_access deny bloqueados

    Você pode incluir quantos domínios quiser dentro da regra, 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. Neste caso, crie um arquivo de texto simples, com todos os domínios desejados (um por linha) e use a regra abaixo na configuração do Squid. 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 num 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 permitidos
    http_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. Neste caso, a regra ficaria:

    acl ips-bloqueados dst 200.234.21.23 200.212.15.45
    http_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 216.239.57.99
    google.com A 216.239.37.99

    Depois de adicionar as novas regras, nosso arquivo de configuração ficaria assim:

    http_port 3128
    visible_hostname kurumin

    cache_mem 32 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 80 # http
    acl Safe_ports port 21 # ftp
    acl Safe_ports port 443 563 # https, snews
    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 Safe_ports port 901 # SWAT
    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 bloqueados url_regex -i "/etc/squid/bloqueados"
    http_access deny bloqueados

    acl redelocal src 192.168.1.0/24
    http_access allow localhost
    http_access allow redelocal

    http_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 pelas duas regras não chegarão a passar pela seguinte.

    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", por exemplo. Ao usar esta regra, o Squid verifica a existência das palavras na URL do site e não no conteúdo da página.

    Crie mais um arquivo de texto, contendo as palavras que devem ser bloqueadas (uma por linha) e adicione a regra abaixo, contendo a localização do arquivo:

    acl nomesproibidos dstdom_regex "/etc/squid/nomesproibidos"
    http_access deny nomesproibidos

    O uso desta regra é um pouco mais problemática, pois bloqueará todas páginas que contenham alguma das palavras listadas na URL. Esta opção sempre levará a alguns falsos positivos e por isso deve ser usada com mais cuidado.

    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. Basta usar as duas regras simultaneamente, como em:

    acl bloqueados url_regex -i "/etc/squid/bloqueados"
    http_access deny bloqueados
    acl nomesproibidos dstdom_regex "/etc/squid/nomesproibidos"
    http_access deny nomesproibidos

    acl redelocal src 192.168.1.0/24
    http_access allow localhost
    http_access allow redelocal
    http_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:

    Você pode personalizar as páginas de erro editando os arquivos dentro da pasta "/usr/share/squid/errors/English" ou "/usr/share/squid/errors/Portuguese" (de acordo com a língua definida na configuração). São várias páginas html, uma para cada tipo de erro indicado.


    Gerenciando o uso da banda


    O Squid oferece uma forma simples de limitar o uso da banda disponível e definir o quanto cada usuário pode usar (mantendo parte do link livre para os demais), utilizando um recurso chamado "delay pools". Por exemplo, imagine que você tem um link de 1 megabit para uma rede com 20 usuários. Se cada um puder ficar baixando o que quiser, é provável que a rede fique saturada em determinados horários, deixando a navegação lenta para todo mundo.

    Você pode evitar isso limitando a banda que cada usuário pode usar e a banda total, que todos os usuários somados poderão usar simultaneamente. É recomendável, neste caso, que o servidor proxy (que combina todos os acessos via http) consuma um pouco menos que o total de banda disponível, de forma a sempre deixar um pouco reservado para outros protocolos.

    Um link de 1 megabit (1024 kbits) corresponde a 131.072 bytes por segundo. Nas regras do Squid, sempre usamos bytes, por isso lembre-se de fazer a conversão, dividindo tudo por 8 e multiplicando por 1024 para ter o número em bytes.

    Podemos limitar a banda total usada pelo Squid a 114.688 bytes por segundo, deixando 128 kbits do link livres para outros protocolos e limitar cada usuário a no máximo 16.384 bytes por segundo, que correspondem a 128 kbits. Nem todos os usuários vão ficar baixando arquivos a todo momento, por isso o valor ideal reservado a cada usuário vai variar muito de acordo com a rede. Você pode acompanhar o uso do link e ir ajustando o valor conforme a utilização.

    Neste caso, a parte final do arquivo de configuração ficaria:

    acl redelocal src 192.168.1.0/24
    delay_pools 1
    delay_class 1 2
    delay_parameters 1 114688/114688 16384/16384
    delay_access 1 allow redelocal
    http_access allow localhost
    http_access allow redelocal
    http_access deny all

    A acl "redelocal" agora está condicionada a três novas regras, que aplicam o uso do limite de banda. O acesso continua sendo permitido, mas agora dentro das condições especificadas na linha "delay_parameters 1 114688/114688 16384/16384", onde vão os valores com a banda total disponível para o Squid e a banda disponível para cada usuário.

    Veja que nesta regra limitamos a banda apenas para a acl "redelocal" e não para o "localhost". Isso significa que você continua conseguindo fazer downloads na velocidade máxima permitida pelo link a partir do servidor; a regra se aplica apenas às estações. É possível também criar regras para endereços IP específicos, que poderão fazer downloads sem passar pelo filtro.

    Concluindo, mais um tipo de bloqueio que é útil em muitas situações é com relação a formatos de arquivos. Você pode querer bloquear o download de arquivos .exe ou .sh para dificultar a instalação de programas nas estações, ou bloquear arquivo .avi ou .wmf para economizar banda da rede, por exemplo. Neste caso, você pode usar a regra a seguir, especificando as extensões de arquivo desejadas:

    acl video url_regex -i \.avi
    http_access deny video


    Bloqueando por horário


    As regras a seguir fazem com que o proxy recuse conexões feitas dentro de determinados horários. Você pode definir regras para períodos específicos e combiná-las para bloquear todos os horários em que você não quer que o proxy seja usado. Para que o proxy bloqueie acessos feitos entre meia-noite e 6:00 da manhã e no horário de almoço, por exemplo, você usaria as regras:

    acl madrugada time 00:00-06:00
    http_access deny madrugada

    acl almoco time 12:00-14:00
    http_access deny almoco

    Estas regras iriam novamente antes da regra "http_access allow redelocal" no arquivo de configuração.

    Agora imagine que você quer fazer diferente. Ao invés de bloquear o acesso na hora de almoço, você quer deixar o proxy aberto, para que aqueles que queiram acessar o Orkut ou acessar os e-mails possam fazer isso fora do horário de trabalho. Neste caso você usaria uma regra como:

    acl almoco time 12:00-14:00
    http_access allow almoco

    Esta regra entraria no arquivo de configuração antes das regras "http_access deny bloqueados" e "http_access deny nomesproibidos". Assim, os acessos que forem aceitos pela regra do almoço não passarão pelas regras que fazem o bloqueio.

    Você pode também combinar o bloqueio de palavras ou domínio com as regras de bloqueio por horário, permitindo que os usuários acessem um determinado site apenas no horário de almoço, por exemplo. A regra, neste caso, seria:

    acl almoco time 12:00-14:00
    acl orkut dstdomain orkut.com www.orkut.com
    http_access allow orkut almoco

    Assim, o acesso ao site (que normalmente estaria bloqueado em uma acl mais adiante) é permitido dentro do horário de almoço.

cb
HOME