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

Por: Perfil removido em 02/03/2012


Trabalhando com o Módulo Recent - Parte II



Continuando a prática.....

Que tal bloquear o SSH ou outro serviço e só liberar para IPs de origem que estejam na tabela criada, usando o Módulo Recent, mas o IP de origem só estará na tabela depois que for enviado um pacote para uma porta especifica.

Bom, é isso que irá ser feito no próximo exemplo, para mostrar como se pode trabalhar com o Módulo Recent.

Para colocar em prática, primeiro será criado 3 regras no Host 192.168.20.10 que roda o SSH.

Na primeira, adiciono uma regra a Chain INPUT que trata todos os pacotes TCP destinados a porta 63000, criando com o Módulo Recent, uma tabela chamada de OpenSSH, e adicionando o endereço de origem de quem está enviando o pacote, e quando estes pacotes forem tratados pelo IPtables, serão bloqueados.

Na segunda regra, aceito todos os pacotes destinados à porta 22 do SSH, que sejam do protocolo TCP e que o endereço de origem esteja na tabela (-- name) OpenSSH, pois o mesmo será verificado (--update) pelo Recent e caso esteja realmente na tabela, será aceito.

Na terceira regra, bloqueio todas as conexões via SSH destinadas à porta 22.

# iptables -A INPUT -p tcp --dport 63000 -m recent --set --name openssh -j REJECT
# iptables -A INPUT -p tcp --dport 22 -m recent --update --name openssh -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j REJECT


- Testando:

* Primeiro, tento me conectar ao Host rodando o SSH, e onde estão as regras sem enviar nenhum pacote para a porta 63000:

# date;ssh -p 22 edson@192.168.20.10
Qua Fev 22 13:42:37 BRT 2012
ssh: connect to host 192.168.20.10 port 22: Connection refused

[ Não se conectou... ]

* Veja após a tentativa de conexão, a saída do comando "iptables -nvL", e observe que tem um pacote dropado.

# iptables -nvL
Chain INPUT (policy ACCEPT 1298 packets, 213K bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:63000 recent: SET name: openssh side: source
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 recent: UPDATE name: openssh side: source
1 60 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable

* Agora, o envio do pacote para a porta 63000, usando o Telnet do Host 192.168.20.20, e o pacote será bloqueado, porém, o endereço de origem será adicionado à tabela.

# date;telnet 192.168.20.10 63000
Qua Fev 22 14:12:08 BRT 2012
Trying 192.168.20.10...
telnet: Unable to connect to remote host: Connection refused

* Saída dos comandos abaixo, na máquina com o servidor SSH, veja que o pacote foi bloqueado e na mesma o endereço foi adicionado à tabela:

# iptables -nvL
Chain INPUT (policy ACCEPT 89 packets, 11250 bytes)
pkts bytes target prot opt in out source destination
1 60 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:63000 recent: SET name: openssh side: source reject-with icmp-port-unreachable
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 recent: UPDATE name: openssh side: source
1 60 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable

# cat /proc/net/xt_recent/openssh
src=192.168.20.20 ttl: 64 last_seen: 1051576 oldest_pkt: 1 1051576

* Após o envio do pacote, a tentativa de conexão via SSH:

# date;ssh -p 22 edson@192.168.20.10
Qua Fev 22 14:15:39 BRT 2012
edson@192.168.20.10's password:

Last login: Tue Feb 21 23:50:31 2012 from abrtop.local

[ Conexão realizada com sucesso....]

* Tentativa de conexão de Host que não tem o endereço de origem na tabela:

# date;ssh -p 22 edson@192.168.20.10
Qua Fev 22 14:16:10 BRT 2012
ssh: connect to host 192.168.20.10 port 22: Connection refused

[ Não se conectou.... ]

* Após a conexão via SSH, veja a saída do comando "iptables -nvL" e "cat /proc/net/xt_recent/openssh", e veja também que foi recusada mais uma conexão que é justamente do IP que não está na tabela.

# iptables -nvL
Chain INPUT (policy ACCEPT 422 packets, 52871 bytes)
pkts bytes target prot opt in out source destination
1 60 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:63000 recent: SET name: openssh side: source reject-with icmp-port-unreachable
18 2797 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 recent: UPDATE name: openssh side: source
2 180 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable

# cat /proc/net/xt_recent/openssh
src=192.168.20.20 ttl: 64 last_seen: 1117918 oldest_pkt: 18 1051576, 1117174, 1117174, 1117178, 1117178, 1117178, 1117178, 1117182, 1117189, 1117199, 1117199, 1117291, 1117790,
1117801, 1117801,
1117804, 1117808, 1117918

Após testar, veja que após aplicar as regras, tentei acessar via SSH e foi bloqueada a conexão, pois o endereço de origem não estava na tabela.

Depois disso, enviei um pacote para a porta 63000, para adicionar o endereço de origem na tabela OpenSSH, aí em seguida, tentei outra vez a conexão e foi realizada com sucesso. Depois tentei com outra máquina conectar-me, mas aí foi bloqueada a conexão, pois o endereço da máquina de origem não estava na tabela.

Para remover o endereço de origem da tabela, crie a regra abaixo, na máquina com o SSH e depois envie o um pacote via Telnet.

# iptables -A INPUT -p tcp --dport 23000 -m recent --name openssh --remove -j REJECT
# telnet 192.168.20.10 23000


Para o último exemplo, será feito praticamente a mesma coisa do exemplo anterior, porém, irei controlar a conexão no servidor SSH operando na porta 22 com base em tempo e quantidade.

Aplicação de regras e explicação das mesmas:

# iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 558 -m recent --name timessh --set -j REJECT
# iptables -A INPUT -p tcp --syn --dport 22 -m recent --name timessh --update --seconds 30 --hitcount 2 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j REJECT


- Na primeira regra, serão aceitos pacotes de conexões já estabelecidas na porta 22.

- Na segunda regra, bloqueio conexões na porta 558. Esta porta será usada para incluir endereços de pacotes de origem na tabela TimeSSH usando o Módulo Recent, para que a próxima regra aceite pacotes de endereços de origem que estão nesta tabela.

- Na terceira regra, aceito tentativas de novas conexões somente de pacotes de endereços de origem, que estejam na tabela TimeSSH e que tenham 2 ou mais pacotes registrados na tabela no intervalo de 30 segundos. Caso não tenha dois ou mais pacotes no intervalo de 30 segundos na tabela, então será executado a próxima regra.

- Na última regra, bloqueio todas conexões nesta porta 22.

- Testando: * Tentativa de conexão via SSH na porta 22:

date;ssh -p 22 edson@192.168.20.10
Qua Fev 22 19:29:17 BRT 2012
ssh: connect to host 192.168.20.10 port 22: Connection refused

[ Não se conectou... ]

* Veja a saída do comando abaixo, após a primeira tentativa de conexão sem entradas na tabela TimeSSH:

# iptables -nvL
Chain INPUT (policy ACCEPT 34 packets, 4200 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state RELATED,ESTABLISHED
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:558 recent: SET name: timessh side: source reject-with icmp-port-unreachable
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 recent: UPDATE seconds: 30 hit_count: 2 name: timessh side: source
1 60 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable

* Envio do pacote via Telnet para liberar o SSH na porta 22, e nova tentativa de conexão via SSH, a conexão foi bloqueada, pois é a mesma.

date;telnet 192.168.20.10 558
Qua Fev 22 19:30:18 BRT 2012
Trying 192.168.20.10...
telnet: Unable to connect to remote host: Connection refused

# date;ssh -p 22 edson@192.168.20.10
Qua Fev 22 19:30:30 BRT 2012
ssh: connect to host 192.168.20.10 port 22: Connection refused

[ Não se conectou.... ]

* Após segunda tentativa de conexão via SSH, sem sucesso:

# iptables -nvL
Chain INPUT (policy ACCEPT 90 packets, 11028 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state RELATED,ESTABLISHED
1 60 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:558 recent: SET name: timessh side: source reject-with icmp-port-unreachable
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 recent: UPDATE seconds: 30 hit_count: 2 name: timessh side: source
2 120 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable

* Envio de outro pacote Telnet e nova tentativa de conexão via SSH, com sucesso desta vez, pois a mesma aconteceu após ser enviados dois pacotes para porta 558, no intervalo de 30 segundos

# date;telnet 192.168.20.10 558
Qua Fev 22 19:30:36 BRT 2012
Trying 192.168.20.10...
telnet: Unable to connect to remote host: Connection refused

# date;ssh -p 22 edson@192.168.20.10
Qua Fev 22 19:30:38 BRT 2012
edson@192.168.20.10's password:

Last login: Wed Feb 22 19:18:27 2012 from abrtop.local

* Após envio do segundo pacote Telnet e tentativa de conexão via SSH com sucesso:

# iptables -nvL
Chain INPUT (policy ACCEPT 104 packets, 12463 bytes)
pkts bytes target prot opt in out source destination
16 2737 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state RELATED,ESTABLISHED
2 120 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:558 recent: SET name: timessh side: source reject-with icmp-port-unreachable
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 recent: UPDATE seconds: 30 hit_count: 2 name: timessh side: source
2 120 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable

# cat cat /proc/net/xt_recent/timessh
src=192.168.20.20 ttl: 64 last_seen: 5841279 oldest_pkt: 2 5836616, 5841279

Veja no decorrer dos Posts, que foram bloqueadas duas tentativas de acesso via SSH por que o endereço de origem não tinha duas ou mais entradas no intervalo de 30 segundos na tabela TimeSSH. Repito a dizer que isto foi feito com o SSH, mas poderia ser feito com outro serviço ou de acordo com a necessidade de cada um.

Finalizando

Como podem perceber, o Módulo Recent cria um arquivo dentro do diretório “/proc/net/xt_recent”, chamado: conexoes_ssh (que é o nome de nossa tabela), para controle das conexões. Se tivéssemos criado outras tabelas, também seriam criados outros arquivos respectivos.

O interessante, é que podemos manipular estes arquivos e consequentemente, manipular as tabelas:

# echo +192.168.20.15 > /proc/net/xt_recent/timessh - para adicionarmos um endereço na tabela
# echo -192.168.20.10 > /proc/net/xt_recent/timessh - para removermos um endereço da tabela
# echo / > /proc/net/xt_recent/timessh - para limparmos a tabela


Algo importante que precisa ser colocado, é que se você for trabalhar com um grande número de conexões no seu Firewall, por padrão, o Módulo Recent irá armazenar apenas 100 endereços nas tabelas criadas.

Para alterar este valor, por exemplo para 1024, precisamos passar para o módulo 'xt_recent' algumas Flags:

# modinfo xt_recent

filename:       /lib/modules/2.6.29.4-167.fc11.i686.PAE/kernel/net/netfilter/xt_recent.ko
alias:          ip6t_recent
alias:          ipt_recent
license:        GPL
description:    Xtables: "recently-seen" host matching for IPv4
author:         Jan Engelhardt
author:         Patrick McHardy
srcversion:     0CA8710587603DFF5C5923B
depends:       
vermagic:       2.6.29.4-167.fc11.i686.PAE SMP mod_unload 686
parm:           ip_list_tot:number of IPs to remember per list (uint)
parm:           ip_pkt_list_tot:number of packets per IP to remember (max. 255) (uint)
parm:           ip_list_hash_size:size of hash table used to look up IPs (uint)
parm:           ip_list_perms:permissions on /proc/net/xt_recent/* files (uint)
parm:           ip_list_uid:owner of /proc/net/xt_recent/* files (uint)
parm:           ip_list_gid:owning group of /proc/net/xt_recent/* files (uint)


# echo "options xt_recent ip_list_tot=1024" ; /etc/modprobe.d/xt_recent.conf

Não esqueça de descarregar o módulo e recarregá-lo.

Referências


Página anterior    

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

Adaptador Bluetooth no Slackware

Multiboot pelo pendrive usando grub2: instalando várias distros a partir de uma unidade de armazenamento móvel

Novidades do Kernel 2.6.35

Instalando o Gnome-2.20.0 no Slacware 12

Alguém, salve os multiterminais do Proinfo. Por favor!

Leitura recomendada

Desvendando as regras de Firewall Linux Iptables

Como construir um firewall de baixo custo para sua empresa (parte 2)

GUI para Iptables via web, linha de comando e outros

Gerenciando regras de Iptables com Firewall Builder

Integrando Layer7 + IPP2P ao Iptables

  
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