IPtables/Squid transparentes - Bloqueando Facebook em HTTP/HTTPS por horários

Publicado por Talis Paes em 18/08/2012

[ Hits: 10.483 ]

Blog: http://www.ceres.udesc.br

 


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:

# iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 11:45 -j DROP
# iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 11:45 -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


Bloqueio do Orkut das: 07:30 às 11:45, e das: 13:30 às 17:45:

# iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "orkut.com" -m time --timestart 07:30 --timestop 11:45 - j DROP
# iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "orkut.com" -m time --timestart 07:30 --timestop 11:45 -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


Bloqueio do YouTube das: 07:30 às 11:45, e das: 13:30 às 17:45:

# iptables -t filter -I FORWARD -p tcp --dport 443 -m string --algo bm --string "youtube.com" -m time --timestart 07:30 --timestop 11:45 -j DROP
# iptables -t filter -I FORWARD -p tcp --sport 443 -m string --algo bm --string "youtube.com" -m time --timestart 07:30 --timestop 11:45 -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


Como funciona o bloqueio

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.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Instalando extensões no MediaWiki usando o Git

Arch Linux direto do pendrive ou CD de instalação sem precisar do archinstaller

PGAdmin 1.8.4 no CentOS Linux 5.2 (i386 / x86_64)

Acessando partições NTFS (read/write) com ntfs-3g (Slackware Linux 12)

O comando paste

  

Comentários
[1] Comentário enviado por removido em 19/08/2012 - 23:18h

Ótima dica !

[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?

[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 ?

[4] Comentário enviado por Samuray007 em 22/08/2012 - 15:01h

Boa tarde.
Até agora está tudo bloqueado. Win XP, iPhone, celulares, Win Seven.

Estou pesquisando como liberar o acesso para alguns PCs e como instalar o bloqueio por horário que não deu certo. Apresentou:

iptables v1.3.6: Couldn't load match `time':/lib/iptables/libipt_time.so: cannot open shared object file: No such file or directory.

Pesquisando, assim que conseguir colocar a funcionar aviso como fiz para funcionar redondinho.

[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.

Att,

Talis

[7] Comentário enviado por talis em 30/10/2012 - 17:25h


[1] Comentário enviado por Thalysson S em 19/08/2012 - 23:18h:

Ótima dica !


Obrigado, aqui ajudou muito.

[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.

att,

Talis

[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 ).

# iptables -t filter -I FORWARD ! -d 200.154.56.80 -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 11:45 -j DROP
# iptables -t filter -I FORWARD ! -s 200.154.56.80 -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 11:45 -j DROP
# iptables -t filter -I FORWARD ! -d 200.154.56.80 -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 ! -s 200.154.56.80 -p tcp --sport 443 -m string --algo bm --string "facebook.com" -m time --timestart 13:30 --timestop 17:45 -j DROP

[12] Comentário enviado por cslima em 22/11/2012 - 13:08h

Talis, te agradeço pela resposta... Vou testar e posteriormente posto aqui o resultado. Vlw!

[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:

iptables -I FORWARD -m string --algo bm --string "facebook.com" -j DROP

Então só tive que especificar a porta, bem como no seu exemplo, e tudo funcionou ok! Nem foi preciso colocar a exceção...

Vou acrescentar isso no tópico que abri pedindo ajuda, e vou compartilhar a sua dica com quem mais precisar... OBRIGADO!

[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

-------------------------------------------------
iptables -t filter -I FORWARD ! -s 10.0.10.64/255.255.255.192 -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 11:45 -j DROP
----------------------------------------------------

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.


[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


exit 0



Obrigado desde já

[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


exit 0



Obrigado desde já



[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.

Att: Lester Guimarães

[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.

Att: Lester Guimarães



[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

[21] Comentário enviado por awichert em 02/10/2013 - 11:06h

Parabéns! Funcionou perfeitamente.

Como eu faço para liberar para determinado ip?
Obrigado

[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.

iptables -t filter -I FORWARD ! -s 10.0.10.64/255.255.255.192 -p tcp --dport 443 -m string --algo bm --string "facebook.com" -m time --timestart 07:30 --timestop 11:45 -j DROP
----------------------------------------------------

Na teoria, tu libera todos os IPs do 10.0.10.65 ao 10.0.10.127.

[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?



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts