IPtables - Bloqueando sites de relacionamentos

Publicado por Cesar Vieira Bento em 29/03/2013

[ Hits: 16.819 ]

Blog: http://mmasterinformatica.com.br

 


IPtables - Bloqueando sites de relacionamentos



Pesquisei muito sobre como bloquear sites de relacionamentos (tipo Facebook), e encontrei muitas maneiras na Internet, mas, com soluções nada práticas, muito complicadas.

Resolvi fazer alguns testes com IPtables, já que o Squid no modo transparente, não controla HTTPS (porta 443), então, cheguei ao seguinte comando que funcionou aqui comigo:

# iptables -A FORWARD -m string --algo bm --string "facebook.com" -j REJECT

É claro que este comando deve ficar dentro do seu script de Firewall, para poder funcionar toda vez que o servidor proxy for iniciado.

Melhorando um pouco, fiz o seguinte:

for i in $(cat /root/webs-negado.txt)
   do
       iptables -A FORWARD -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
       iptables -A FORWARD -m string --algo bm --string "$i" -j REJECT
done


O que isto faz, é pegar todos os domínios que estão dentro do arquivo /root/webs-negado.txt e criar duas regras para cada site:
  • A primeira cria um registro ("LOG");
  • E a segunda, bloqueia ("REJECT").

Caso você não tenha um script com regras de firewall, postei um aqui no VOL:
Obs.: não esquecendo que estas regras devem ser as primeiras na chain FORWARD.

Outras dicas deste autor

Placa wirelles no Dell Vostro 1000 com Linux fácil, fácil

Novo driver para placa wireless BCM4312

Leitura recomendada

Usando internet wireless com autenticação PPPoE

Conexão 3G no Ubuntu 10.04 (Lucid Lynx)

Liberando o Windows Live Messenger 2009 no Squid (completo)

Liberando acesso ao Conectividade Social

Bloqueando o Orkut em horários pré-determinados.

  

Comentários
[1] Comentário enviado por removido em 30/03/2013 - 00:38h

Anotado.

[2] Comentário enviado por rafaelcss em 01/04/2013 - 12:11h

Bom dia, com seria com opção para "IPs liberados"?

por exemplo, bloquear o Facebook para todo mundo, menos para uma lista de IPs

Tenho esse problema do proxy transparente, mas aqui algumas pessoas podem acessar, então não posso bloquear totalmente.

[3] Comentário enviado por fadel_damen em 01/04/2013 - 13:32h

o grande problema dos tipos de regras tigo --string e que se voce tiver outros site que usam ou fazem chamadas ao facebook por exemplo este site tambem teram problemas em abrir.

[4] Comentário enviado por jeanmdg em 01/04/2013 - 13:45h

Adiciona mais um for:

for i in $(cat /etc/firewall/webs-negado.txt)
do
for ip_usuario in $(cat /etc/firewall/users.txt)
do
${IPTABLES} -A FORWARD ! -s "$ip_usuario" -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
${IPTABLES} -A FORWARD ! -s "$ip_usuario" -m string --algo bm --string "$i" -j REJECT
done
done




[2] Comentário enviado por rafaelcss em 01/04/2013 - 12:11h:

Bom dia, com seria com opção para "IPs liberados"?

por exemplo, bloquear o Facebook para todo mundo, menos para uma lista de IPs

Tenho esse problema do proxy transparente, mas aqui algumas pessoas podem acessar, então não posso bloquear totalmente.



[5] Comentário enviado por cesar-linux em 01/04/2013 - 14:39h

Para liberar alguns IPs tem que estar liberar nos dois sentidos:
origem (-s) e destino (-d), pelo menos aqui comigo não funcionou dando somente a origem do pacote.

for i in $(cat /etc/firewall/webs-negado.txt)
do
for ip_usuario in $(cat /etc/firewall/users.txt)
do
${IPTABLES} -A FORWARD ! -s "$ip_usuario" -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
${IPTABLES} -A FORWARD ! -s "$ip_usuario" -m string --algo bm --string "$i" -j REJECT
${IPTABLES} -A FORWARD ! -d "$ip_usuario" -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
${IPTABLES} -A FORWARD ! -d "$ip_usuario" -m string --algo bm --string "$i" -j REJECT
done
done

[6] Comentário enviado por jeanmdg em 01/04/2013 - 15:48h

Aqui deu problema para liberar mais de um usuario nessa regra.

Não libera todos ips da lista. o ultimo FORWARD bloqueia os de cima.

[7] Comentário enviado por cesar-linux em 01/04/2013 - 15:58h

Vou passar minha situação.
Eu precisei liberar para somente uma maquina em um cliente, fiz o seguinte:

xxx.xxx.x.x = ip da maquina a ser liberada

iptables -A FORWARD -s xxx.xxx.x.x -j ACCEPT
iptables -A FORWARD -d xxx.xxx.x.x -j ACCEPT

for i in $(cat /root/webs-negado.txt)
do
iptables -A FORWARD -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
iptables -A FORWARD -m string --algo bm --string "$i" -j REJECT
done

[8] Comentário enviado por cicloredes em 06/04/2013 - 08:28h

Modulo string já esta presente por default no iptables, qual distro vc esta usando.

[9] Comentário enviado por cesar-linux em 08/04/2013 - 07:58h

Eu uso debian.

[10] Comentário enviado por acsoprana em 13/06/2013 - 09:19h

Olá pessoal, eu ja tenho feito isso no meu script mais o log nao esta funcionando...

ai fiz um registro de log para acesso a porta 22 e funciona.. Porque que quando eu tento acessar fazendo cono esta a baixo ele bloqueia mais não gera log?

iptables -A FORWARD -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
iptables -A FORWARD -m string --algo bm --string "$i" -j REJECT

Outra questão, tem como fazer um redirecionar de essa tentativa de acesso para outro site ou ip de uma maquina local ???

por exemplo se a pessoa tentar acessar a pagina do facebook ela será redirecionada a outo IP ou url.. ja tentei fazer de tudo e não funciona!!!

Agradeço desde já.

[11] Comentário enviado por acsoprana em 13/06/2013 - 09:23h


[10] Comentário enviado por acsoprana em 13/06/2013 - 09:19h:

Olá pessoal, eu ja tenho feito isso no meu script mais o log nao esta funcionando...

ai fiz um registro de log para acesso a porta 22 e funciona.. Porque que quando eu tento acessar fazendo cono esta a baixo ele bloqueia mais não gera log?

iptables -A FORWARD -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
iptables -A FORWARD -m string --algo bm --string "$i" -j REJECT

Outra questão, tem como fazer um redirecionar de essa tentativa de acesso para outro site ou ip de uma maquina local ???

por exemplo se a pessoa tentar acessar a pagina do facebook ela será redirecionada a outo IP ou url.. ja tentei fazer de tudo e não funciona!!!

Agradeço desde já.


Resolvido pessoal... tava usando -I em vez do -A

[12] Comentário enviado por acsoprana em 13/06/2013 - 09:25h


[11] Comentário enviado por acsoprana em 13/06/2013 - 09:23h:


[10] Comentário enviado por acsoprana em 13/06/2013 - 09:19h:

Olá pessoal, eu ja tenho feito isso no meu script mais o log nao esta funcionando...

ai fiz um registro de log para acesso a porta 22 e funciona.. Porque que quando eu tento acessar fazendo cono esta a baixo ele bloqueia mais não gera log?

iptables -A FORWARD -m string --algo bm --string "$i" -j LOG --log-prefix "FIREWALL: HTTPS-NEGADO "
iptables -A FORWARD -m string --algo bm --string "$i" -j REJECT

Outra questão, tem como fazer um redirecionar de essa tentativa de acesso para outro site ou ip de uma maquina local ???

por exemplo se a pessoa tentar acessar a pagina do facebook ela será redirecionada a outo IP ou url.. ja tentei fazer de tudo e não funciona!!!

Agradeço desde já.

Resolvido pessoal... tava usando -I em vez do -A



mais ainda to com o seguinte problema: Outra questão, tem como fazer um redirecionar de essa tentativa de acesso para outro site ou ip de uma maquina local ???

por exemplo se a pessoa tentar acessar a pagina do facebook ela será redirecionada a outo IP ou url.. ja tentei fazer de tudo e não funciona!!!

Agradeço desde já.

[13] Comentário enviado por cesar-linux em 13/06/2013 - 10:30h

Para redirecionar paginas eu uso o Squid, colocando o seguinte codigo dentro do arquivo /usr/share/squid/errors/pt-br/ERR_ACCESS_DENIED

<meta http-equiv="refresh"content="2;url=http://www.site_redirecionado.com.br">

Coloque este codigo dentro de <head> que abrira o site redirecionado apos 2 segundo.

No meu caso ficou assim:
--------------------Inicio-----------------------
html>
<head>
<meta http-equiv="refresh"content="2;url=http://www.mmasterinformatica.com.br">
<title>ERRO: A URL requisitada não pôde ser recuperada</title>
<style type="text/css"><!-- %l body :lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; } :lang(he) { direction: rtl; float: right; } -->
</style>
</head>
<body>
<div id="titles">
<h1>ERRO</h1>
<h2>A URL solicitada não pode ser recuperada</h2>
</div>
<hr>
<div id="content">
<p>O seguinte erro foi encontrado ao tentar recuperar a URL: <a href="%U">%U</a></p>
<blockquote id="error"> <p><b>Acesso Negado.</b></p> </blockquote>
<p>Configuração de controle de acesso impede que sua solicitação seja permitido no momento. <br>
Entre em contato com seu Administrador de serviços, se isto for incorreto.</p>
<p>Seu administrador do cache é <a href="mailto:%w%W">%w</a>.</p> <br> </div>
<hr>
<div id="footer"> <p>Gerado %T por %h (%s)</p>
<img src="http://mmasterinformatica.com.br/wp-content/uploads/2013/02/logo.png">
</div>
</body>
</html>

---------------------Fim------------------------

[14] Comentário enviado por acsoprana em 13/06/2013 - 14:04h


[13] Comentário enviado por cesar-linux em 13/06/2013 - 10:30h:

Para redirecionar paginas eu uso o Squid, colocando o seguinte codigo dentro do arquivo /usr/share/squid/errors/pt-br/ERR_ACCESS_DENIED

<meta http-equiv="refresh"content="2;url=http://www.site_redirecionado.com.br">

Coloque este codigo dentro de <head> que abrira o site redirecionado apos 2 segundo.

No meu caso ficou assim:
--------------------Inicio-----------------------
html>
<head>
<meta http-equiv="refresh"content="2;url=http://www.mmasterinformatica.com.br">
<title>ERRO: A URL requisitada não pôde ser recuperada</title>
<style type="text/css"><!-- %l body :lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; } :lang(he) { direction: rtl; float: right; } -->
</style>
</head>
<body>
<div id="titles">
<h1>ERRO</h1>
<h2>A URL solicitada não pode ser recuperada</h2>
</div>
<hr>
<div id="content">
<p>O seguinte erro foi encontrado ao tentar recuperar a URL: <a href="%U">%U</a></p>
<blockquote id="error"> <p><b>Acesso Negado.</b></p> </blockquote>
<p>Configuração de controle de acesso impede que sua solicitação seja permitido no momento. <br>
Entre em contato com seu Administrador de serviços, se isto for incorreto.</p>
<p>Seu administrador do cache é <a href="mailto:%w%W">%w</a>.</p> <br> </div>
<hr>
<div id="footer"> <p>Gerado %T por %h (%s)</p>
<img src="http://mmasterinformatica.com.br/wp-content/uploads/2013/02/logo.png">
</div>
</body>
</html>

---------------------Fim------------------------


ok, mais assim eu utilizo o iptables para bloquear acesso ao FACEBOOK através da string de url.
só que quando o usuário tenta acessar a página ela fica apenas no aviso de pagina não encontrada. eu gostaria de fazer que
quando isso acontecesse o próprio iptables redirecionasse para uma pagina do squid ou outra maquina qualquer que mostraria um aviso
de acesso negado.
Ou talvez através do bloqueio de string do iptables manda para o squid onde o mesmo mostra o acesso denied..
será que tem como... ???


[15] Comentário enviado por cesar-linux em 13/06/2013 - 17:20h

O que eu fiz, foi bloquear pelo iptables e redirecionar pelo squid todos sites bloqueados para o site da empresa.

[16] Comentário enviado por acsoprana em 14/06/2013 - 09:46h


[15] Comentário enviado por cesar-linux em 13/06/2013 - 17:20h:

O que eu fiz, foi bloquear pelo iptables e redirecionar pelo squid todos sites bloqueados para o site da empresa.



Dai cesar e como vc fez isso??? porque pelo iptables a pagina fica naquela msg servidor não encontrado...
como vc redireciona isso para o squid ?


[17] Comentário enviado por cesar-linux em 14/06/2013 - 11:14h

vc tem que ter o squid instalado e configurado, que vc pode achar aqui mesmo no vol.

apos isto, colocando o navegador para navegar pelo proxy, que não poderá trabalhar no modo transparente, senão não vai funcionar, assim no proxy vc bloqueia a palavra "facebook".

O proxy vai levar para a pagina de acesso negado, e depois sera redirecionado para a pagina que vc quiser. no meu caso como no exemplo acima vai para mmasterinformatica.com.br

coloque isto dentro <head>
<meta http-equiv="refresh"content="2;url=http://www.mmasterinformatica.com.br">

arquivo com pagina de Acesso Negado: /usr/share/squid/errors/pt-br/ERR_ACCESS_DENIED

[18] Comentário enviado por acsoprana em 14/06/2013 - 11:42h


[17] Comentário enviado por cesar-linux em 14/06/2013 - 11:14h:

vc tem que ter o squid instalado e configurado, que vc pode achar aqui mesmo no vol.

apos isto, colocando o navegador para navegar pelo proxy, que não poderá trabalhar no modo transparente, senão não vai funcionar, assim no proxy vc bloqueia a palavra "facebook".

O proxy vai levar para a pagina de acesso negado, e depois sera redirecionado para a pagina que vc quiser. no meu caso como no exemplo acima vai para mmasterinformatica.com.br

coloque isto dentro <head>
<meta http-equiv="refresh"content="2;url=http://www.mmasterinformatica.com.br">

arquivo com pagina de Acesso Negado: /usr/share/squid/errors/pt-br/ERR_ACCESS_DENIED




Sim eu já tenho o squid configurado e funcionando, mas pelo squid não da pra bloquear o Facebook porque o mesmo utiliza a porta 443. e mesmo utilizando squid se transparência ate bloqueou mais não redirecionou para a pagina de bloqueio
o que acontece é que eu estou usando o iptables para bloquear o face usando a opção de STRING. Só que quando ele bloqueia ele mostra no navegador a tela com a informação "Servidor não encontrado"...
eu queria que quando ele bloqueasse o acesso ele redirecionaria para um ip ou uma pagina qualquer..


[19] Comentário enviado por marciotecnico em 15/01/2015 - 22:05h

Depois que usei essa string no iptables meus e-mail começaram a dar erro de recebimento até parar, tive que remover da tabela, alguma dica?



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts