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

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

aMSN com fontes bonitas

Configuração básica do Conky para mostrar informações sobre a sua máquina no Desktop

Postfix com courier-pop de forma simples

Instalando o compiz no Arch Linux

Usando classes em conexão e consultas à banco de dados em PHP

Leitura recomendada

Instalando um firewall mínimo em Debian

Automatizando Firewall com IDS Snort e SnortSam

Utilizando a ferramenta Iptstate

IpCop - Um firewall personalizado

Firewall Linux - Roteamento avançado usando iproute2 e iptables (load balance)

  
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