Bloqueio de sites por horário: Squid + IPtables

Publicado por Benedito em 13/02/2015

[ Hits: 4.274 ]

 


Bloqueio de sites por horário: Squid + IPtables



Um dos problemas mais comuns para quem implementa o Squid nas empresas para fazer a filtragem de sites é a questão de que as regras por horário podem não funcionar como gostaríamos, em certos casos.

É de conhecimento de muitos que, quando passa do horário de intervalo (de almoço, por exemplo), os usuários ainda conseguem manter o acesso aos sites que estavam proibidos antes deste horário, se mantiverem simplesmente seu navegador aberto e atualizando a página constantemente.

Com isso, o cidadão que trabalha aí na sua empresa pode começar a navegar no Facebook no horário de almoço e continuar com isto até o fim do expediente!

Isso ocorre porque após o horário de almoço, o servidor proxy ainda continua com conexões estabelecidas com os servidores do Facebook, fazendo com que a navegação a estes sites continue sem a análise dos horários descritos nas ACLs do Squid, mesmo após o horário de almoço.

Com isso, criei o script abaixo que faz com que depois do horário de intervalo, regras de Firewall sejam criadas para bloquear as conexões já existentes, fazendo com que estes acessos caiam.

Implementação

Horário de almoço: 12:00 ~ 13:30.

O script deve ser ativado no crontab um minuto após o horário de almoço e pode ser desativado 5 minutos depois:

31 13 * * * root /usr/local/sbin/bloqueia_face ativabloqueio
36 13 * * * root /usr/local/sbin/bloqueia_face desativabloqueio

Funcionamento

Como dito antes, as conexões permanecem estabelecidas após o horário de almoço e por isso, o pessoal ainda consegue acessar o Face. Quando é ativado o bloqueio, são identificadas as conexões existentes com os hosts do Facebook e são criadas regras de Firewall, que fazem o bloqueio para estas conexões.

Segue o script:

#!/bin/bash  -x

## bloqueia_face - Cria/deleta regras de bloqueio para conexões estabelecidas com o facebook
## Escrito por: Benedito Marques
## CentOS release 6.2 (Final)

# Exemplo de uso: ./bloqueia_face ativabloqueio

URL="www.facebook.com fbstatic-a.akamaihd.net facebook.com xx-fbcdn-shv-05-iad1.fbcdn fbcdn-profile-a.akamaihd.net"
for I in `/bin/echo $URL`
do
#GUARDA OS IPS DO FACEBOOK
    FAC=`/usr/bin/dig +short $I | /bin/grep [0-9].[0-9].[0-9].[0-9]`
    FACEBOOK="$FACEBOOK $FAC"
done
#GUARDA AS PORTAS DOS SOCKETS DE ORIGEM QUE ESTÃO CONECTADAS AO FACEBOOK
SPORTS=$(for i in `/bin/echo $FACEBOOK` ; do /bin/netstat -nt | /bin/grep "`/bin/echo $i`"| /bin/awk -F ' ' '{print $4}' | /bin/cut -d ':' -f5 ; done)

if [ "$1" = "ativabloqueio" ]; then
    #VERIFICA SE A VARIÁVEL $SPORTS É VAZIA
    if [ -z "$SPORTS" ]; then
        /bin/echo "Sem conexões com o Facebook. A ativação do bloqueio não é necessária."
    else

        for i in `/bin/echo $SPORTS`
        do
            for j in `/bin/echo $FACEBOOK`
            do
                IP=`/bin/netstat -nt | /bin/grep $i | /bin/awk -F ' ' '{print $5}' | /bin/cut -d ':' -f4`
                /sbin/iptables -I OUTPUT -d $IP -p tcp --sport $i -m multiport --dports 443,80 -j DROP
                break
            done
        done

    fi

elif [ "$1" = "desativabloqueio" ]; then

    #COLETANDO REGRAS CRIADAS ANTES
    /sbin/iptables-save  | /bin/grep OUTPUT | /bin/grep DROP | /bin/grep tcp | /bin/grep 443 | /bin/grep 80 | /bin/sed 's/-A/\/sbin\/iptables -t filter -D/g' > /tmp/regras
    #REMOVENDO REGRAS COLETADAS
    . /tmp/regras

else
   /bin/echo -e "Argumento incorreto! \nOpções possíveis: ativabloqueio, desativabloqueio."

fi

Observações

1. O script acima não irá bloquear quem possui NAT e está acessando o Facebook, pois foi usada a chain OUTPUT bloqueando única e exclusivamente o servidor proxy. Além disso, quando há NAT as conexões não ficam no proxy, e sim na máquina local.

2. O script também não irá bloquear quem, pelo proxy, tem permissão de acesso ao Facebook fora do horário, pois ele faz restrições pela porta do socket de origem já existente (--sport), permitindo novas conexões do proxy para os IPs do Facebook.

3. É importante deixar as regras de bloqueio ativas por no mínimo 5 minutos, pois durante este tempo, observei no monitoramento do tráfego que há alguns keep-alives de minuto em minuto do proxy para os servidores do Facebook e que precisam ser bloqueados para finalizar as conexões estabelecidas.

4. Se o usuário mantiver a página do Facebook aberta fora do horário do almoço e só vier a mexer depois que as regras forem retiradas, também haverá bloqueio, pois as conexões que estavam estabelecidas já tiveram seu tempo de estabelecimento esgotado.

5. O script acima foi implementado para bloquear somente o Facebook, porém, pode ser alterado posteriormente para bloquear outros tipos de sites que os usuários venham a abusar do uso fora do horário de almoço, bastando acrescentar o site à variável $URL separando-os por espaço.

Pronto, a partir de agora, o bloqueio por horário será feito.

Fiquem com Deus!

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Saída de comando "route" organizada

Ativando o Multilib (forma fácil) no Slackware

Corrigindo horário no Xubuntu

Gerando sources lists para o Ubuntu

Melhorando Desempenho Gráfico do Cinnamon

  

Comentários
[1] Comentário enviado por fabio em 13/02/2015 - 13:10h

Muito boa a solução, meus parabéns!

Agora uma dúvida, se ao encerrar o horário de almoço eu agendar um "/etc/init.d/squid restart" no cron funcionaria? Teoricamente um restart no serviço cortaria as conexões ativas certo?

[2] Comentário enviado por bmarquesm em 13/02/2015 - 22:21h

O restart funcionaria, porém a navegação iria parar para todos que estivessem utilizando o proxy para acessar a internet. Além disso, o restart poderia demorar dependendo do tamanho do seu cache.

[3] Comentário enviado por wagnerfs em 15/02/2015 - 21:01h


Muito bom. Parabéns e obrigado por compartilhar o conhecimento.
_________________________
Wagner F. de Souza
Graduado em Redes de Computadores
"GNU/Linux for human beings."
LPI ID: LPI000297782



Contribuir com comentário