Filtro de conteúdo com iptables

Publicado por Carlos Affonso Henriques. em 12/09/2007

[ Hits: 13.916 ]

 


Filtro de conteúdo com iptables



No kernel 2.6.18 em diante foram incluídos vários módulos no ramo NetFilter e um deles é o xt_string, que é usado para fazer filtragens por palavras-chave. Sua aplicação é muito simples e pode ser aplicado em todas as chains do iptables.

Vamos à sua sintaxe:

[chain|tabela] -m string --algo kmp --string "[palavra-chave]" [alvo]

Onde:
  • --algo: é o algoritimo empregado para o rastreamenteo de palavras chave que pode ser:
    • bm: Boyer-Moore;
    • kmp: Knuth-Pratt-Morris.
    Referem-se aos autores do algoritmo

Exemplo:

# iptables -I OUTPUT -o ppp0 \
   -m string --algo kmp --string "google.com" -j DROP


O xt_string ainda permite que você identifique em que parte do pacote aplicar o filtro com os parâmetros --from e --to, embora estas opções somente serão usadas se você tiver conhecimento profundo acerca do pacote que deseja aplicar o filtro. Esta funcionalidade é muito útil especialmente por delimitar uma faixa onde o filtro irá buscar a palavra chave em um datagrama, o que acelera muito o processo.

Exemplo:

# iptables -I OUTPUT -o ppp0 \
   -m string --algo kmp --from 1 --to 8192 \
   --string "google.com" -j DROP


A regra acima determina que somente seja bloqueada a string google.com que se situe entre o bit 1 e 8192 inclusive em um datagrama. Caso não sejam especificados os valores de --from e --to o módulo aplica os valores 0 (zero) e 65535, respectivamente.

O parâmetro --hex-string é usado quando se deseja aplicar o filtro sob uma notação hexadecimal. Exemplo:

# iptables -I OUTPUT -o ppp0 \
   -m string --algo kmp --from 32768 --to 65535 \
   --hex-string "FFF" -j DROP


Outras dicas deste autor

Instalar o CentOS a partir de um chaveiro USB

Obtendo Número de Série do MikroTik Routerboard

Executando comandos do Shell Bash pelo Python

Docker containers com aplicações gráficas

Lógica booleana com o test

Leitura recomendada

Retirando o poder de root do bind no Slackware

Centralizando logs de dispositivos Cisco com o Syslog-ng

Instalar e configurar BackupPc no Fedora 12

Segurança básica para servidores brasileiros

Carteira do KDE (kwallet)

  

Comentários
[1] Comentário enviado por andersonjackson em 12/09/2007 - 15:53h

Pense em uma dica boa..

Parabéns..

Um forte abraço.

[2] Comentário enviado por bjaraujo em 12/09/2007 - 19:59h

Valeu cara. Se puder me tire uma dúvida. Esse filtro só funciona em OUTPUT ou FORWARD e PREROUTING tb? No modo hex eu poderia filtrar até mesmo protocolos néh? Obrigado.

[3] Comentário enviado por elgio em 12/09/2007 - 21:48h

Normalmente sou crítico a "artigos" que deveriam ser dicas...
Mas esta dica, com um pouquinho mais de conteúdo, seria um excelente artigo!!

Só faço algumas considerações (NÃO CRÍTICAS)

- considerar que em máquinas que são roteadores de rede com grande largura de banda isto poder virar um gargalo

- considerar que o filtro não é perfeito, pois atua sobre um único datagrama IP. Se a palavra "google" (do exemplo) ficou quebrada em dois datagramas, um que foi somente até "goo" e o outro com o "gle" o filtro não vai falhar. Alguem que saiba disso pode preparar pacotes que passem pelo filtro.

Segurança perfeita não existe.
:-D

[4] Comentário enviado por capitainkurn em 13/09/2007 - 07:27h

Elgio, também penso como você, mas geralmente posto artigos tirados de cenários reais ou quando não são, gasto um tempo para elabora-los pois não acho legal postar um artigo que "não funciona". Como eu não fiz nada que requeresse o filtro em questão em um contexto mais elaborado preferí não me esticar, e deixar o tema como curiosidade.
Obrigado, fico feliz que tenha gostado da dica.

[5] Comentário enviado por capitainkurn em 13/09/2007 - 07:36h

Bruno, até onde constatei ele funciona em qualquer chain do Iptables, e certamente tem capacidade de filrar protocolos como MSN por exemplo, mas o mais interessante do filtro é que você pode especificar excessões podendo por exemplo permitir que só se possa conversar com determinados contatos do MSN. Deverei brevemente fazer um projeto neste sentido, pois a empresa quer que os funcionários somente conversem com clientes, fornecedores, filiais etc. E o L7 filter não resolve isso.

[6] Comentário enviado por wleao em 11/11/2007 - 00:35h

Como funciona esta regra de liberação do vnc ?

$IPTABLE -I FORWARD -p tcp -m string --string "VER" --from 51 --to 56 --algo bm -j ACCEPT

Como posso traduzir o que ela faz?

Eu consegui apenas entender que ele esta inserindo uma regra de liberação onde os dados são redirecionados para outra interface de rede ou outra maquina. No entanto o que significar --from 51 --to 56 e o "VER" entre aspas ?

[7] Comentário enviado por capitainkurn em 11/11/2007 - 11:38h

O exemplo que você citou seria o seguinte:
O netfilter somente deixa passar pela cadeia FORWARD pacotes tcp que possuam a string VER que situem-se entre os bits 51 e 56 de um datagrama empregando o algoritmo de busca Boyer-Moore (autores do algoritmo)

[8] Comentário enviado por jorgemendes em 22/02/2018 - 16:41h

Olá amigos,
Tenho um proxy na rede e um firewall com iptables que fecha a porta 80 para forward, forçando os usuários a saírem para a internet através do squid. Entretanto, há algumas exceções, domínios que devem ser liberados para serem acessados diretamente.
Tudo certo com o wpad.dat, as exceções funcionam bem, mas o problema acontece quando preciso liberar a porta 80 para qualquer coisa ".gov.br" por exemplo. O comando que conheço é este:
iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j ACCEPT
Mas não abre. Tentei o inverso, bloqueando tudo ".gov.br" com:
iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j DROP
e funcionou perfeitamente.
Mas como eu disse, preciso LIBERAR. Alguma idéia?
Obrigado.

[9] Comentário enviado por CapitainKurn em 26/02/2018 - 11:35h

Não testei mas suponho que uma exeção possa ser especificada com um ponto de exclamação.

iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string !".gov.br" -j DROP

Testa e conte-nos.

Abraço.

[10] Comentário enviado por ksombrah em 23/05/2023 - 20:35h

Olá estou tentando bloquear os downloads de um webmail específico, pesquisando cheguei nesse script:
for i in 172.217.1.110 216.239.32.10 216.239.34.10 216.239.36.10 216.239.38.10 142.251.16.26 142.251.16.27 142.251.163.26 142.251.163.27 142.251.167.26
do
iptables -A INPUT -p tcp -d $i --dport 80 -m string --string "Content-Disposition: attachment;" --algo bm -j DROP
iptables -A INPUT -p tcp -d $i --dport 80 -m string --string "Content-Disposition: attachment;" --algo bm -j REJECT
iptables -A INPUT -p tcp -d $i --dport 443 -m string --string "Content-Disposition: attachment;" --algo bm -j DROP
iptables -A INPUT -p tcp -d $i --dport 443 -m string --string "Content-Disposition: attachment;" --algo bm -j REJECT
iptables -A FORWARD -p tcp -d $i --dport 80 -m string --string "Content-Disposition: attachment;" --algo bm -j DROP
iptables -A FORWARD -p tcp -d $i --dport 80 -m string --string "Content-Disposition: attachment;" --algo bm -j REJECT
iptables -A FORWARD -p tcp -d $i --dport 443 -m string --string "Content-Disposition: attachment;" --algo bm -j DROP
iptables -A FORWARD -p tcp -d $i --dport 443 -m string --string "Content-Disposition: attachment;" --algo bm -j REJECT
done
Mas não está funcionando, alguma idéia?


Paz e Bem!
Alcione Ferreira
Sombra®
101080
[http://www.alcionesytes.net/]
------------------------------------------------
Liberdade e conhecimento ao alcance de todos.

Office Escritório - http://www.libreoffice.org/
Navegador Firefox - http://www.mozilla.org.br/
Email Thunderbird - http://www.mozilla.org.br/
---------------------------------------------------------------
Linux user number 432030 of http://counter.li.org/
---------------------------------------------------------------
ICQ: 377035698
Jabber: ksombrah@jabber.org
MSN: alcione.sombra@hotmail.com
---------------------------------------------------------------
Curriculum: http://lattes.cnpq.br/0545256741852110



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts