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.882 ]

Por: Perfil removido em 02/03/2012


Trabalhando com os Módulos Time e Limit



Módulo Time

O Módulo Time pode ser usado quando queremos tratar os pacotes usando o IPtables, quanto ao tempo, seja em dia ou hora. As regras aplicadas com o Módulo Time são muito interessantes para podermos criar regras vinculadas com horário, como por exemplo, liberar acesso a determinado site ou serviço no horário de almoço.

Para usar o Módulo Time, faz uso da opção "-m", como nos outros módulos e o nome do módulo "time".

- Algumas opções usadas:
  • --timestart : Está opção é usada para especificar a partir de que hora a regra será validada. Se não especificada, será: 00:00. Valor em HH:MM.
  • --timestop : Está opção é usada para especificar até que hora a regra será validada. Se não for especificada, o valor será: 23:59. valor em HH:MM.
  • --weekdays : Está opção especifica em que dias da semana a regra será validada. Os dias são: Mon, True, Wed, Thu, Fri, Sat e Sun.
  • --monthdays : Está opção é usada para especificar em que dias do mês a regra será validada, os valores possíveis são 1 a 31, e devem ser colocados assim 2,3. Neste caso, seria o dia 2 até o dia 3.
  • --datestart : Está opção é usada para especificar a partir de que data a regra começará a ser validada. Os campos devem ser preenchidos assim: YYYY- MM-DDThh:mm:ss, onde 'YYYY' é o ano, 'MM' é o mês, 'DD' é o dia, 'T' é para indicar o tempo, 'hh' é a hora, 'mm' são os minutos e 'ss' são os segundos.
  • --datestop : Está opção é usada para especificar até que data a regra será validada. os campos devem ser preenchidos assim: YYYY-MM- DDThh:mm:ss, onde YYYY é o ano, MM é o mês, DD é o dia, T é para indicar o tempo, hh é a hora, mm são os minutos e ss são os segundos.

- Colocando em Prática

Na primeira regra usada para testar o uso do módulo time, vou bloquear o acesso de um Host 192.168.20.10 da minha rede interna, das 08:00 até as 18:00, todos os dias ao Webmin da máquina local, onde a regra está sendo executada.

# iptables -A INPUT -s 192.168.20.10 -p tcp --dport 10000 -m time --timestart 08:00 --timestop 18:00 -j DROP

Na segunda regra, faço uso do Módulo String que já foi abordado no artigo e bloqueio a String "orkut" para bloquear o site do Orkut, liberando o mesmo somente no horário 12:00 às 14:00 para todos os Hosts.

Mas depois desta regra, coloco outra para bloquear o tráfego com essa String durante o tempo que a primeira regra não faz referência a algum pacote que transite, ou seja, enquanto o período de 12:00 até as 14:00 não chega.

# iptables -A FORWARD -m string --algo bm --string "orkut" -m time --timestart 12:00 --timestop 14:00 -j ACCEPT
# iptables -A FORWARD -m string --algo bm --string "orkut" -j DROP


Na Terceira regra, vou permitir o protocolo P2P (Kaaza, Emulee, etc..) de segunda à sexta no horário de 12:00 às 14:00, nos outros horários e dias, será bloqueado o tráfego.

Obs.: para usar o módulo 'ipp2p', é necessário que o mesmo esteja compilado para o kernel que está usando.

# iptables -A FORWARD -m ipp2p --ipp2p -m time --timestart 12:00 --timestop 14:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
# iptables -A FORWARD -m ipp2p --ipp2p -j DROP


Módulo Limit

O Módulo Limit é um tipo de módulo sempre bem vindo quando se quer mais segurança para evitar que sua rede ou servidores, sejam vitimas de ataques. As regras que fazem uso deste módulo, trabalham com quantidade e tempo.

O módulo permiti especificar o número de vezes em determinado intervalo de tempo que uma regra conferirá quando todas as condições forem satisfeitas.

Por exemplo: "-m limit --limit n/t", onde 'n' é o número de vezes e 't' é o tempo, ou seja, um número 'n' de ocorrências deverá ser verificado em um determinado tempo 't'. Quando este valor for atingido, a próxima regra será executada, o que normalmente é com o alvo DROP.

- As opções usadas são:
  • --limit n/t : Está opção permite especificar a taxa de conferências do Limit, onde 'n' é o número de vezes em deverá ocorrer em 't' intervalo de tempo.
      As opções de tempo são:
    • s : segundo
    • m : minuto
    • h : hora
    • d : dia
  • --limit-burst : Com esta opção, poderemos indicar o número inicial máximo de pacotes que irão conferir, este número é aumentado 1 a cada vez que o "--limit" não for atingido.


A sintaxe é a mesma dos outros módulos, onde '-m' indica que será chamado um módulo seguido do nome do módulo, no caso 'limit' com as opções "--limit n/t" com e, ou "--limit-burst".

* Saiba como utilizar este módulo, pois o mesmo pode fazer que clientes não acessem serviços, caso a regra seja aplicada sem um bom planejamento e uma boa bateria de testes.

- Colocando em Prática

Para testar bem este módulo, primeiro vai ser aplicada uma regra limitando 2 pacotes ICMP (ping) em um intervalo de um minuto, a partir do terceiro ping, no intervalo de um minuto a próxima regra será executada bloqueando os pacotes.

* A máquina com as regras é: 192.168.20.10

# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/m -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP


- Testando:

# ping -c 6 192.168.20.10
# iptables -nvL

Chain INPUT (policy ACCEPT 6 packets, 1254 bytes)
pkts bytes target prot opt in out source destination
5 420 ACCEPT icmp -- * * 0.0.0.0/0 0.0.050/0 icmp type 8 limit: avg 2/min burst 5
1 84 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8

Após o teste, percebemos que saiu algo de errado, pois foi enviado 6 pacotes ICMP para o destino com as regras do IPtables aplicadas e mesmo assim, só foi bloqueado 1, e 5 ICMP passaram, veja na saída do comando:

# iptables -nvL

Que a primeira regra tratou 5 pacotes, permitindo sua passagem. Enquanto que a segunda que era para bloquear 4 dos pacotes bloqueou apenas 1. Por que isso?

A resposta, é que quando usamos o Módulo Limit, automaticamente, é setado um valor que especifica o número inicial de pacotes que irá conferir com a regra, e o valor padrão é 5. Assim sendo, para a regra dar certo, precisamos especificar a opção "--limit-burst" com o número 2, como faço abaixo:

# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/m --limit-burst 2 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP


- Testando:

# ping -c 6 192.168.20.10
# iptables -nvL

Chain INPUT (policy ACCEPT 41 packets, 5109 bytes)
pkts bytes target prot opt in out source destination
2 168 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8 limit: avg 2/min burst 2
4 336 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8

Agora sim, a regra permitiu dois pacotes, e a partir do terceiro, em um intervalo de um minuto bloqueou os outros, no caso 4.

Na regra anterior, usei o intervalo em minuto, porém, nada me impede de usar segundos, mas para a regra acima, seria mais interessante usar em segundos, pois em segundos impede um ataque como o 'ping da morte', então, abaixo coloco as regras em segundos:

# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP


- Testando:

# ping -c 10 -i 0.0 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.166 ms

--- 192.168.20.10 ping statistics ---
10 packets transmitted, 1 received, 90% packet loss, time 94ms
rtt min/avg/max/mdev = 0.166/0.166/0.166/0.000 ms, ipg/ewma 10.520/0.166 ms

# iptables -nvL
Chain INPUT (policy ACCEPT 159 packets, 112K bytes)
pkts bytes target prot opt in out source destination
1 84 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8 limit: avg 1/sec burst 1
9 756 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8

Perceba que a regra funcionou muito bem, pois bloqueou 9 pacotes dos 10 enviados, aceitando apenas 1. Pois quando executei o ping, ao invés de usar o intervalo padrão de 1 segundo, usei o intervalo de 0.0 segundos entre o envio de cada pacote, assim ele enviou 10 pacotes em um segundo e a regra aceitou apenas 1, como era previsto.

Na segunda regra, mudei a porta do SSH para 2100, mas isso não adianta, pois usando o NMAP ou outro programa, poderemos detectar que serviço está rodando e até mesmo rodar programas que tentam se autenticar por meio de força bruta, então, colocamos uma regra para permitir apenas 1 conexão por segundo, caso a segunda seja realizada no intervalo de um segundo, então a mesma será bloqueada.

# iptables -A INPUT -p tcp --dport 2100 -m limit --limit 1/s --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp --dport 2100 -j DROP


- Testando:

* Máquina rodando NMAP e escaneando o IP que roda o SSH na porta 2100.

# nmap -sV -p 2100 192.168.20.10
Starting Nmap 5.00 ( http://nmap.org ) at 2012-02-20 16:26 BRT
Interesting ports on 192.168.20.10:
PORT STATE SERVICE VERSION
2100/tcp open ssh OpenSSH 5.5p1 Debian 6+squeeze1 (protocol 2.0)
MAC Address: 70:71:BC:59:E3:4A (Unknown)
Service Info: OS: Linux

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.34 seconds

# iptables -nvL

* Máquina com as regras e o serviço SSH.
Chain INPUT (policy ACCEPT 6 packets, 1254 bytes)
pkts bytes target prot opt in out source destination
6 312 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2100 limit: avg 1/sec burst 1
11 592 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2100

Veja que mesmo bloqueando pacotes que entram com uma frequência de dois por segundo, ainda foram aceitos 6 pacotes, e bloqueado 11 e ainda foi identificado qual serviço roda na porta escaneada.

Seria mais interessante para a segurança, aceitar apenas um ou dois pacotes por minutos ao invés que por segundo, como foi feito nas regras abaixo, aceitando apenas um pacote no intervalo de um minuto.

# iptables -A INPUT -p tcp --dport 2100 -m limit --limit 1/m --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp --dport 2100 -j DROP


- Testando:

* Máquina com NMAP.

# nmap -sV -p 2100 192.168.20.10
Starting Nmap 5.00 ( http://nmap.org ) at 2012-02-20 16:30 BRT
Interesting ports on 192.168.20.10:
PORT STATE SERVICE VERSION
2100/tcp open unknown
MAC Address: 70:71:BC:59:E3:4A (Unknown)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 35.46 seconds

# iptables -nvL
Chain INPUT (policy ACCEPT 16 packets, 2732 bytes)
pkts bytes target prot opt in out source destination
1 44 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2100 limit: avg 1/min burst 1
11 560 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2100

Agora veja que foi bloqueado 11 pacotes, e só foi aceito um e que o NMAP não conseguiu identificar qual serviço roda na porta aberta, apesar que o mesmo passou quase 36 segundos escaneando mais tempo que da primeira vez, o que não é tanto tempo, porém, já foi obtido mais êxito que da primeira.

Porém, se for aplicar esta regra em um ambiente de produção, tome CUIDADO, pois a conexão, desde a autenticação até a troca de dados, depois que a conexão estiver estabelecida, ficará bem lenta. Mas poderá contornar isto, aplicando uma regra antes desta, aceitando o tráfego de conexões já estabelecidas.

Uma regra que substituiria a última, seria as que estão abaixo, pois assim, ele apenas bloquearia a tentativa de novas conexões, isto irá fazer com que seja estabelecida uma conexão por minuto, assim teria uma boa proteção contra ataques de força bruta.

Por exemplo:

# iptables -A INPUT -p tcp --dport 2100 --syn -m limit --limit 1/m --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp --dport 2100 --syn -j DROP
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

Sistemas operacionais imutáveis e suas tecnologias

Jogos via Internet em 2 minutos com Hamachi

Introduzindo um pouco mais a fundo o shell script (revisado)

Configurando o OpenOffice para edição de texto - swriter/oowriter

Resumo LPI 102: Tópico 107 - Tarefas Administrativas

Leitura recomendada

PFSense Firewall com Squid e SquidGuard

Endian Firewall - Solução completa para um servidor de internet

Bloqueando o UltraSurf e o WebMessenger do Hotmail com Proxy Transparente

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

Entendendo TCP/IP (Parte 5) - Portas TCP/UDP

  
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