IPtables/Squid transparentes - Bloqueando Facebook em HTTP/HTTPS por horários
Não encontrei formas de fazer Squid/proxy transparente bloquear o HTTPS/443 sem "pirar" os certificados.
Tentei então, bloquear via IPtables o endereço facebook.com, no entanto, ele acabou bloqueando junto, muitas páginas que
possuem: "eu curto" - do Facebook (blogs, g1.com, r7.com, ufsc.br, etc), que existe na maioria das páginas.
Implementando bloqueio
Em artigos diferentes, encontrei a solução ideal para o bloqueio via IPtables sem bloquear as páginas, usando o módulo string e o
módulo time.
Tudo que era pela porta 80/HTTP, usei o Squid/SquidGuard normalmente, e para bloquear a porta 443/HTTPS das páginas facebook.com,
orkut.com e youtube.com, eu usei os comandos abaixo.
Bloqueio do Facebook das: 07:30 às 11:45, e das: 13:30 às 17:45:
O firewall abre todos os pacotes e procura a string (ex.: facebook.com), e quando encontra dentro do determinado horário, ele o descarta.
Nesta forma, são apenas os pacotes que contém determinada string que são descartados, assim, todos os sites que possuem o botão "eu curto"
abrem normalmente.
Se você também tentar bloquear via IPtables os pacotes com a string "facebook.com" que são direcionadas para a porta 80, fará com que o
firewall bloqueie a maioria das páginas integralmente.
Deixe que o Squid filtre a porta 80. Use esta regra apenas para o 443.
Ao tentar abrir o facebook.com com HTTPS na frente com este bloqueio, no navegador não irá aparecer a tela de bloqueio como ocorre com o
Squid, vai dar apenas "time out" ou "página não encontrada".
Espero ter ajudados vocês, porque eu "pastei" muito até achar esta solução.
[3] Comentário enviado por jgmenotti em 22/08/2012 - 14:05h
Boa tarde,
Esta configuração funcionou para bloquear facebook pelo IPTABLES, mas somente para estações com windows XP. As estações com Windows 7 estranhamente, continuam acessando via https o facebook. Com você aconteceu esta situação ?
[5] Comentário enviado por flaviomstes em 20/09/2012 - 14:37h
Ola companheiro, consegui bloquear o fecebook, mas parece que na hora é subi o site faceboook, as regras não sobre, o que pode ser... ja verifiquei a hora do sistema, ela aprincipio estava errado, mas concertei, mas mesmo assim ainda continua não subido as regras, Obrigado..
[6] Comentário enviado por talis em 30/10/2012 - 17:25h
[3] Comentário enviado por jgmenotti em 22/08/2012 - 14:05h:
Boa tarde,
Esta configuração funcionou para bloquear facebook pelo IPTABLES, mas somente para estações com windows XP. As estações com Windows 7 estranhamente, continuam acessando via https o facebook. Com você aconteceu esta situação ?
O bloqueio é de baixo nível, ele faz o filtro direto no pacote TCP, indiferente do sistema operacional, desta forma o bloqueio vale para Windows, Linux, Mac OS, Android e outros.
A única forma de ele não estar bloqueado o Windows 7 é por estas estações não estão passando pelo filtro. Verifica:
Se essas estações não estão em outra faixa de IP;
Se os IPs dessas estações não estão liberadas no squid;
Se não existe 2 serviços DHCP provendo IPs na rede.
[8] Comentário enviado por talis em 30/10/2012 - 17:27h
[2] Comentário enviado por Samuray007 em 21/08/2012 - 20:39h:
Saudações. Muito boa essa configuração.
Preciso de ajuda pois aparece esse erro ao subir essa regra de bloqueio:
iptables v1.3.6: Couldn't load match `time':/lib/iptables/libipt_time.so: cannot open shared object file: No such file or directory
Como faço para resolver esse problema?
Ola,
Você precisa do Módulo do IPTABLES chamado TIME. Verifica na sua distribuição como deve proceder com a instalação do mesmo.
No meu caso eu instalei com o apt-get install.
[9] Comentário enviado por talis em 30/10/2012 - 17:32h
[5] Comentário enviado por flaviomstes em 20/09/2012 - 14:37h:
Ola companheiro, consegui bloquear o fecebook, mas parece que na hora é subi o site faceboook, as regras não sobre, o que pode ser... ja verifiquei a hora do sistema, ela aprincipio estava errado, mas concertei, mas mesmo assim ainda continua não subido as regras, Obrigado..
Ola,
Eu não entendi o que não deu certo. Você esta dizendo que na hora que era para liberar, o mesmo não libera?
Se for isto, verifica se o fuso horário não esta desconfigurado, eu tive esse problema no squid a um tempo atrás. Funciona assim, você diz para o sistema que está com +3 horas (horário de Brasília) mas o sistema (squid ou iptables) quando usa o horário do kernel, ele usa sem o fuso horário. Assim os bloqueis não funcionam mesmo.
Aqui no #VivaoLinux tem vários tutoriais para diversas distribuições.
[10] Comentário enviado por cslima em 22/11/2012 - 01:29h
Essa dica é ótima e realmente bloqueia o "face", mas tive que desabilitar ela do meu firewall, pois com essas regras o outlook simplesmente nao funciona! Tentei de tudo, mas não tem jeito, o outlook só volta a receber os emails quando esta regra de bloqueio é desabilitada... O que será que acontece? Um possível explicação para isso seria o fato de que a maioria dos emals recebidos na minha rede interna contém imagens com links para o facebook. Existe algum "antídoto" para esse "efeito colateral" da regra?
[11] Comentário enviado por talis em 22/11/2012 - 10:53h
[10] Comentário enviado por cslima em 22/11/2012 - 01:29h:
Essa dica é ótima e realmente bloqueia o "face", mas tive que desabilitar ela do meu firewall, pois com essas regras o outlook simplesmente nao funciona! Tentei de tudo, mas não tem jeito, o outlook só volta a receber os emails quando esta regra de bloqueio é desabilitada... O que será que acontece? Um possível explicação para isso seria o fato de que a maioria dos emals recebidos na minha rede interna contém imagens com links para o facebook. Existe algum "antídoto" para esse "efeito colateral" da regra?
Esta linha de bloqueio só funciona na porta 443, então o teu outlook deve restar trafegando nesta porta. Para não precisar mudar o servidor de e-mail, ou ir em todas as maquinas, eu recomendo fazer uma exceção.
Você pode criar uma exceção para o endereço IP do servidor de e-mails, basta colocar sem aspas: " ! -d IP_DO_SERVIDOR " e " ! -s IP_DO_SERVIDOR ".
Abaixo eu usei com exemplo o ip do terra.com.br, dessa forma ele irá ignorar todos os pacotes direcionados e originado no respectivo IP. No lugar do IP do terra.com.br, você pode colocar o IP do seu servidor de e-mail. Também pode ser colocado o IP de origem do usuário, liberando o acesso a uma maquina interna (mas tem que inverter a origem e destino -d -s ).
[13] Comentário enviado por cslima em 26/11/2012 - 00:35h
Talis, preciso corrigir uma coisa que eu disse aqui...
Sua dica está PERFEITA. No meu caso, não estava funcionando porque eu tinha feito a regra de uma forma diferente, SEM especificar a porta! Por isso ocorria o erro com o outlook. Veja, minha regra estava assim:
[14] Comentário enviado por mjsilveira em 04/07/2013 - 14:51h
Ola Talis, eu precisaria colocar mais de um ip no ! -s para ignorar, como posso fazer sem precisar fazer varias linhas iguais ( preciso colocar 6 ips diferentes)?
Se eu crio uma variavel $IPSLIBERADOS= IP1 IP2.. ele so reconhece o primeiro ip e os demais da erro pois interpetra como comando.
[15] Comentário enviado por talis em 04/07/2013 - 19:04h
Eu não testei aqui, mas tente liberar uma faixa menor de endereços dentro dentro da tua faixa maior.
Ex. a tua faixa de IP é 10.0.0.0/255.255.0.0
Quer dizer que o teu IP vai do 10.0.0.0 ao 10.0.255.254.
Então tu cria uma faixa de IP 10.0.10.64/255.255.255.192
Na teoria, tu libera todos os IPs do 10.0.10.65 ao 10.0.10.127.
Mas se tu quer liberar numeros Ips aleatórios, complica.
[14] Comentário enviado por jost em 04/07/2013 - 14:51h:
Ola Talis, eu precisaria colocar mais de um ip no ! -s para ignorar, como posso fazer sem precisar fazer varias linhas iguais ( preciso colocar 6 ips diferentes)?
Se eu crio uma variavel $IPSLIBERADOS= IP1 IP2.. ele so reconhece o primeiro ip e os demais da erro pois interpetra como comando.
[17] Comentário enviado por talis em 09/08/2013 - 10:13h
Leste,
O bloqueio de facebook pela porta 80 é facilmente aplicada pelo squid ou por outra ferramenta proxy.
Este tutorial é para efetuar o bloqueio na porta 443, já que o squid não faz este tipo de controle.
Como descrito no texto, tens que fazer um duplo filtro com proxy pela porta 80 e com o IP tables pela porta 443.
Att,
Talis
[16] Comentário enviado por lester_guimaraes em 09/08/2013 - 09:54h:
Bom dia pessoal, não sei se fiz correto, coloquei a regra no rc.local, porem apenas o face ficou bloqueado pela porta https, o que será que está dando errado?
Ficou da seguinte forma:
iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 13:00 -j DROP
iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 13:00 -j DROP
iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 13:30 --timestop 17:45 -j DROP
iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 13:30 --timestop 17:45 -j DROP
iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "orkut.com" -m time --timestart 07:30 --timestop 13:00 - j DROP
iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "orkut.com" -m time --timestart 07:30 --timestop 13:00 -j DROP
iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "orkut.com" -m time --timestart 13:30 --timestop 17:45 -j DROP
iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "orkut.com" -m time --timestart 13:30 --timestop 17:45 -j DROP
iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "youtube.com" -m time --timestart 07:30 --timestop 13:00 -j DROP
iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "youtube.com" -m time --timestart 07:30 --timestop 13:00 -j DROP
iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "youtube.com" -m time --timestart 13:30 --timestop 17:45 -j DROP
iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "youtube.com" -m time --timestart 13:30 --timestop 17:45 -j DROP
[18] Comentário enviado por lester_guimaraes em 14/08/2013 - 08:30h
Correto @Talis, no meu squid tem configurado corretamente os bloqueios para a porta 80 com proxy transparente para os mesmos serviços. Acho que não me expressei da forma mais clara, o que quero comentar é que ao implementar essa regra, bloqueando o Facebook, orkut e o youtube, apenas está se aplicando ao Facebook, tanto o Orkut, Youtube estão estão passando pelo https.
[19] Comentário enviado por talis em 14/08/2013 - 09:19h
Bom dia,
Teoricamente falando, é para funcionar, já que a regra é igual tanto para o facebook, quanto para o Orkut e o Youtube. A unica coisa que muda é a string a ser usada pelo algorítimo na busca.
Usando a porta 80, os bloqueio ao youtube e ao orkut estão funcionando?
Você fez alguma mudança nas regras?
Não existe alguma liberação no firewall que antecede essa regra?
Eu não uso mais os bloqueios do youtube e orkut aqui, mas sempre funcionou aqui.
[18] Comentário enviado por lester_guimaraes em 14/08/2013 - 08:30h:
Correto @Talis, no meu squid tem configurado corretamente os bloqueios para a porta 80 com proxy transparente para os mesmos serviços. Acho que não me expressei da forma mais clara, o que quero comentar é que ao implementar essa regra, bloqueando o Facebook, orkut e o youtube, apenas está se aplicando ao Facebook, tanto o Orkut, Youtube estão estão passando pelo https.
[20] Comentário enviado por lucianonc em 02/10/2013 - 10:51h
Parabéns!
aki no colégio onde trabalho funcionou bem (coloquei abaixo do nat) foi só eu seguir a dica de talis, inverter o ! -s e ! -d e fazer isso:
iptables -t filter -I FORWARD ! -s 192.168.20.0/24 -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 10:00 -j DROP
iptables -t filter -I FORWARD ! -d 192.168.20.0/24 -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 10:00 -j DROP
só tenho uma dúvida, posso adicionar outras duas faixas de ips na regra, pra liberar o acesso ao facebook? e a regra funcionaria se eu colocasse assim:
iptables -t filter -I FORWARD ! -s 192.168.20.0/24 172.16.0.0/24 192.168.3.0/24 -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 10:00 -j DROP
iptables -t filter -I FORWARD ! -d 192.168.20.0/24 172.16.0.0/24 192.168.3.0/24 -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 10:00 -j DROP
[22] Comentário enviado por lucianonc em 02/10/2013 - 11:44h
Rapaz, num sei, faça assim, coloque subredes ai na sua rede e faça como eu, liere apenas as subredes ki vc quiser, o resto fica bloqueado, ou então siga a dica ai de talis e libere so alguns ips.
[23] Comentário enviado por meetgyn em 12/11/2013 - 15:36h
Fiz tudo direitinho aqui no meu firewall rodando no Centos 6.5 e não funcionou. ja o mesmo Script no meu Debian 7.0 funcionou. O que será que fiz de errado no Centos?