IPtables - Trabalhando com Módulos

O objetivo do artigo, é mostrar como expandir o uso do IPtables usando módulos, para construir um Firewall bem elaborado e que
atenda às suas necessidades.

[ Hits: 90.013 ]

Por: Perfil removido em 02/03/2012


Trabalhando com o Módulo Recent



Módulo Recent

O Módulo Recent é o módulo mais interessante que já usei, com ele é possível criar tabelas dinâmicas, com inserção de endereços nas mesmas. É possível criar regras para bloquear determinados IPs que façam referência com determinadas situações que forem estipuladas nas regras, ou, até mesmo bloquear ou abrir portas para determinados serviços através das tabelas.

- Opções:
  • --name : Opção usada para especificar nome da lista. Caso nenhum nome seja informado, será usada DEFAULT.
  • --set : Opção usada para adicionar endereço de origem de um pacote na lista. Caso o endereço já se encontre na lista, irá ser feito uma update do registro.
  • --rcheck : Opção usada para verificar se o endereço de origem do pacote existe na lista.
  • --update : Opção parecida com "--rcheck", porém, além de verificar se o endereço de origem está na lista.
  • --remove : Opção usada para verificar se o endereço de origem está na lista, caso esteja, removerá da lista.
  • --seconds : Opção usada em conjunto com as opções "--rcheck" ou "--update". Usada para verificar se o endereço de origem está na lista, e se a regra ocorreu dentro do prazo estipulado.
  • --hitcount : Opção usada em conjunto com "--rcheck" ou "--update", com ela verifica-se se o endereço de origem do pacote está na lista e se os pacotes foram recebidos de forma maior ou igual do que o especificado nesta opção.
    Pode-se usar está opção junto com a opção "--seconds" para criar um a regra que verifique uma certa quantidade de ocorrências em um intervalo de tempo.
  • --rttl : Opção usada para verificar o tamanho de 'ttl' (time-to-live) corrente com o tamanho do 'ttl' contido na lista. Está opção é usada em conjunto com "--rcheck" ou "--update".
  • --rsource : Salva o endereço de origem de cada pacote na tabela.
  • --rdest : Salva o endereço de destino de cada pacote na tabela.

- Colocando em Prática

Na primeira regra, para mostrar como usar o Módulo Recent, crio a tabela que conterá os dados e adiciono (--set) o IP da máquina que enviou o pacote para todos os pacotes ICMP que tiverem como destino a máquina local (192.168.20.10).

Na segunda regra, irei limitar em 2 pacotes ICMP no máximo em um intervalo de 10 segundos, a partir do terceiro pacote por diante no intervalo de 10 segundos, os pacotes ICMP serão bloqueados por 10 segundos, ou seja, só aceitará 2 pacotes em 10 segundos.

# iptables -A INPUT -p icmp -m recent --name icmp --set
# iptables -A INPUT -p icmp -m recent --name icmp --update --seconds 10 --hitcount 3 -j DROP


Após a execução das regras, vamos testar.

- Testando: * A máquina que contém as regras é 192.168.20.10, e a máquina que envia, é 192.168.20.40.

# ping -c 10 192.168.20.10
PING 192.168.20.10 (192.168.20.10) 56(84) bytes of data.
64 bytes from 192.168.20.10: icmp_req=1 ttl=64 time=0.179 ms
64 bytes from 192.168.20.10: icmp_req=2 ttl=64 time=0.156 ms

--- 192.168.20.10 ping statistics ---
10 packets transmitted, 2 received, 80% packet loss, time 9044ms
rtt min/avg/max/mdev = 0.156/0.167/0.179/0.017 ms

* Verificando as regras pelo IPtables da máquina que está com as regras.

# iptables -nvL
Chain INPUT (policy ACCEPT 9 packets, 1003 bytes)
pkts bytes target prot opt in out source destination
10 840 icmp -- * * 0.0.0.0/0 0.0.0.0/0 recent: SET name: icmp side: source
8 672 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 recent: UPDATE seconds: 10 hit_count: 3 name: icmp side: source

Perceba que dos 10 enviados, 8 foram bloqueados e só 2 foram aceitos, isto acontece porque limitamos apenas para aceitar apenas 2 em 10 segundos, e como o ping por padrão envia um pacote por segundo, 8 foram bloqueados e o endereço de origem fica bloqueado 10 segundos após o ultimo pacote bloqueado.

No segundo exemplo, vou mostrar como o Recent pode ser usado para bloquear ou permitir acesso ao SSH (serviço muito utilizado). Para isto, crio duas regras, a primeira cria uma tabela chamada de 'limitssh', para tentativas de conexões usando o protocolo TCP na porta 22 do Host local 192.168.20.10, e a segunda regra bloqueia por 60 segundos (1minuto) pacotes que venha do protocolo TCP com destino à porta 22 e que tenha 2 ou mais entradas na tabela 'limitssh' registradas em um intervalo de 60 segundos (1 minuto).

# iptables -A INPUT -p tcp --syn --dport 22 -m recent --name limitssh --set
# iptables -A INPUT -p tcp --syn --dport 22 -m recent --name limitssh --update --seconds 60 --hitcount 2 -j REJECT


- Testando:

* Primeira tentativa de conexão na máquina que está com o SSH e com as regras aplicadas - Host 192.168.20.10

# date;ssh -p 22 edson@192.168.20.10
Ter Fev 21 23:48:49 BRT 2012
edson@192.168.20.10's password:

Last login: Tue Feb 21 23:47:09 2012 from abrtop.local

[Se conectou...]

* Segunda tentativa de conexão - poucos segundos depois da primeira tentativa:

# date;ssh -p 22 edson@192.168.20.10
Ter Fev 21 23:48:55 BRT 2012
ssh: connect to host 192.168.20.10 port 22: Connection refused

[Não se conectou...]

* Terceira tentativa de conexão - segundos depois da segunda tentativa que foi bloqueada:

# date;ssh -p 22 edson@192.168.20.10
Ter Fev 21 23:49:35 BRT 2012
ssh: connect to host 192.168.20.10 port 22: Connection refused

[Não conectou...]

* Quarta tentativa de conexão - um minuto depois da última tentativa bloqueada, consegui conectar:

# date;ssh -p 22 edson@192.168.20.10
Ter Fev 21 23:50:36 BRT 2012
edson@192.168.20.10's password:

Last login: Tue Feb 21 23:49:04 2012 from abrtop.loc

[Se conectou]

No exemplo, usei 4 tentativas de conexão para mostrar que após a última a tentativa de conexão que foi bloqueada, será feito um bloqueio no período de 60 segundos, para a máquina com IP na tabela que tem 2 ou mais conexões na porta 22 do protocolo TCP no intervalo de 60 segundos.

Perceba que, mesmo tentando se conectar antes de passar o período de 1 minuto, não consegui, como mostra a segunda e terceira tentativa, e sou obrigado a ficar bloqueado por mais 1 minuto até fazer a quarta tentativa, então, depois deste tempo consigo.

- Na máquina com as regras:

# iptables -nvL
Chain INPUT (policy ACCEPT 240 packets, 31935 bytes)
pkts bytes target prot opt in out source destination
4 240 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 recent: SET name: limitssh side: source
2 120 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 recent: UPDATE seconds: 60 hit_count: 2 name: limitssh side: source reject-with icmp-port-unreachable

- Arquivo que armazena a tabela:

# cat /proc/net/xt_recent/limitssh
src=192.168.215.10 ttl: 64 last_seen: 4655212 oldest_pkt: 6 4633606, 4635219, 4635219, 4639933, 4639933, 4655212

Veja que na saída do comando "iptables -nvL", mostra os quatro pacotes que chegaram com requisição de conexão, e que dois realmente foram bloqueados.

Na tabela que fica dentro do arquivo com o nome da tabela no diretório “/proc/net/xt_recent/”, mostra o IP de origem e quantos pacotes foram enviados pelo mesmo.

Na segunda parte do Módulo Recent, mostrarei mais exemplos de uso.
Página anterior     Próxima página

Páginas do artigo
   1. Introdução e Definição
   2. Trabalhando com os Módulos MAC e Owner
   3. Trabalhando com os Módulos String e IPrange
   4. Trabalhando com os Módulos Quota e Multiport
   5. Trabalhando com os Módulos State e Connlimit
   6. Trabalhando com os Módulos Time e Limit
   7. Trabalhando com o Módulo Recent
   8. Trabalhando com o Módulo Recent - Parte II
Outros artigos deste autor

Udev - Funcionamento e Regras

PostgreSQL 9.4 - O conceito de Role

Criando Arrays, Arrays Multidimensionais e Hashes em BASH Script

Como instalar Postgres 8 no Linux em 10 passos rápidos

Uma "fábula" sobre acessar e mapear unidades de rede do Windows no Linux

Leitura recomendada

Revisão atualizada de instalação do Iptables com Layer7

PFSense Firewall com Squid e SquidGuard

Script de firewall e análise de log

Balanceamento de carga entre 2 placas de rede

Shorewall, uma excelente opção para firewall Linux

  
Comentários
[1] Comentário enviado por joão vous em 02/03/2012 - 20:28h

ipad 2 ele é bloqueado pela apple só que desbloquei usando o cydi
ele ficou meio lento
depois usei um emulador do windows para camuflar a rede do sistema!!!

[2] Comentário enviado por removido em 02/03/2012 - 20:36h

olá amigo joão vous,

Não entendi nada....

[3] Comentário enviado por rodrigom em 03/03/2012 - 01:38h

Boa noite;

Meu amigo, gostei muito do artigo muito bom mesmo.

Obrigado pelo conhecimento passado.

[4] Comentário enviado por hardmaster2009 em 04/03/2012 - 18:03h

Que topido rico !!! que coisa mai linda !! muito bom mesmo !!

[5] Comentário enviado por silent-man em 05/03/2012 - 08:50h

acho que o comentário da seguinte regra está errado

# iptables -A INPUT -p tcp -m string --algo bm --string "orkut" -j DROP

[]s

[6] Comentário enviado por removido em 05/03/2012 - 14:29h

Olá,

Obrigado pelos comentários

Obrigado pela observação amigo silent-man, já foi feita a correção.

abraço..

[7] Comentário enviado por xjc em 05/03/2012 - 15:16h

cara massa esse seu post muito útil vou salvar para posterior consultas. abraços

[8] Comentário enviado por ricardoolonca em 06/03/2012 - 12:17h

Parabéns, excelente artigo!

Estou escrevendo uma série de artigos sobre rede e vou começar a falar de firewall e iptables. Estava a procura de uma documentação sobre esse módulos e o teu artigo veio em ótima hora. Peço tua permissão para citá-lo em meu artigo.

Nota 10 e favorito.

[9] Comentário enviado por removido em 06/03/2012 - 12:28h

Permissão concedida,

é da série de artigo sobre TCP/IP ?

abraço..

[10] Comentário enviado por ricardoolonca em 06/03/2012 - 14:06h

Isso mesmo.

Acabei de fazer um sobre portas TCP/UDP. Nele comento sobre o netstat, nmap, telnet, essas coisas. Achei conveniente explicar esses conceitos antes de falar de firewall. Esse artigo está para ser publicado.

O próximo da série vai ser sobre firewall, mostrando conceitos e parâmetros do iptables. Um dos tópicos seria sobre módulos, mas você já me adiantou um lado.

Obrigado.

[11] Comentário enviado por rodrigom em 06/03/2012 - 16:41h



"maionesebr", quais são seus artigos pode passar os links..



Muito obrigado.

[12] Comentário enviado por ricardoolonca em 09/03/2012 - 13:55h

rodrigom,

segue o link dos meus artigos. (tem um que ainda não foi publicado).

http://www.vivaolinux.com.br/artigos/userview.php?login=maionesebr

[13] Comentário enviado por rodrigom em 09/03/2012 - 17:22h

"maionesebr", já havia lido seus artigos são muito bons, é sempre bom rever..


Abraço.

[14] Comentário enviado por phrich em 29/06/2012 - 12:36h

Bom artigo!

[15] Comentário enviado por marcelohcm em 23/08/2012 - 08:37h

como faço pra bloquear o facebook numa rede?
no caso tenho duas redes, uma liberada e a outra bloqueada...

[16] Comentário enviado por removido em 23/08/2012 - 09:25h

Recomendo para isso o squid. Mas se quer bloquear o facebook usando o IPtables pode dá uma pouquinho mais de trabalho, veja os dois links abaixo, sendo que o primeiro é uma dica aqui da VOL e o segundo é uma resposta de um tópico aqui mesmo da VOL, realmente funciona em ambas dicas:

http://www.vivaolinux.com.br/dica/Bloquear-Facebook-e-Youtube-por-HTTPS/

ou assim:

http://www.vivaolinux.com.br/topico/netfilter-iptables/BLOQUEAR-FACE?pagina=5&num_por_pagina=12

Nesse ultimo link leia a resposta número 50.

[17] Comentário enviado por sthenno em 07/06/2013 - 13:19h

muito útil mesmo o módulo state.
Posso iniciar um download e bloquear depois qualquer tentativa de início de outro sem interromper o primeiro download corrente usando a opção NEW.

[18] Comentário enviado por patrickpfp em 19/06/2013 - 11:25h

Ótimo tutorial!!!

Mas quando eu coloco essa regra:

iptables -A FORWARD -m string --algo bm --string "facebook" -m time --timestart 12:00 --timestop 13:00 -j ACCEPT


esse erro me retorna:

No chain/target/match by that name.



Poderia me ajudar?

vlw



[19] Comentário enviado por removido em 19/06/2013 - 17:07h


[18] Comentário enviado por patrickpfp em 19/06/2013 - 11:25h:

Ótimo tutorial!!!

Mas quando eu coloco essa regra:

iptables -A FORWARD -m string --algo bm --string "facebook" -m time --timestart 12:00 --timestop 13:00 -j ACCEPT

esse erro me retorna:

No chain/target/match by that name.


Poderia me ajudar?

vlw




Qual é a versão e a distro que está usando para aplicar essas regras ? pois apliquei as regras no debian e rodou.

[20] Comentário enviado por px em 10/10/2013 - 16:53h

Esse seu artigo é uma verdadeira enciclopédia sobre iptables! excelente mesmo, nota 10!

[21] Comentário enviado por ftubao em 06/03/2015 - 22:12h

Boa noite a todos !!!!

Eu estava muito feliz por achar este artigo pois na minha cabeça eu ia
resolver meu problema com o facebook aqui no trabalho, para implantar
( não saco muito de Linux ) mandei um e-mail para um " amigo" ultratop em
informática para saber sobre como eu ia colocar o algoritmo, mas, ele me
falou o seguinte;

" Cara, isso provavelmente não vai funcionar. Você nunca vai conseguir
fazer o "match" da srting porque a comunicação se dá via HTTPS. É
impossível "

Pergunto, é isso mesmo ?

[22] Comentário enviado por wagnerfs em 25/03/2015 - 00:28h

Que artigo maravilhoso! Bem explicado e elucidativo. Parabéns 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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts