Você está na página 1de 5

Gerenciando Firewall Linux com IPset

O IPset foi introduzido a partir do kernel 2.6.39 como uma ferramenta integrante do
framework netfilter, para nos auxiliar a gerencias listas. Listas essas que podem ser de
endereço IPs, ranges, portas, mac, e trabalhar com conjuntos com todos esses itens, como por
exemplo um par de ip e mac, ip e porta, e por ai vai.

O IPset é uma forma de podermos agrupar IPs , entre outros em um único nome e fazer
referencia a esse nome da regra de iptables. Facilitando em muito nosso trabalho. E ainda por
cima reduz o consumo de memória e CPU do firewall, pois iremos diminuir a quantidade de
regras substanciamente.

Para instalar o aplicativo, um simples yum install ipset ou apt-get install ipset já é o
suficiente.

Bem para utilizarmos devemos passar por alguns processos:

1. Criar um nome para o conjunto de dados que iremos utilizar.


2. Adicionar os dados ao nome de conjunto, por exemplos ranges de IPs, Portas, etc.
3. Usar o nome do conjunto na regra de iptables.

Vejamos sua sintaxe:

ipset COMANDO [OPÇÕES DE COMANDO]

Onde:

COMANDOS = create|add|del|test|destroy|list|save|restore|flush|rename|etc

Em opções de comandos, vai depender de cada tipo de comando que foi utilizado, por
exemplo para add, teríamos que informar o tipo de dados que serão armazenados, além do
nome. Então para facilitar nossa vida, iremos ver como criar uma lista e posteriormente como
adicionar elementos a essa lista.

Criando um lista com IPset

Quando vamos criar uma nova lista, algumas informações devem ser fornecidas, entre
elas logicamente o nome, método e o tipo. Sua sintaxe seria algo do gênero:

ipset create nomedalista método:tipo


Em tipo são basicamente os itens que podemos utilizar, como por exemplo:

 ip Informa ip, range, rede inteira.


 ip,mac Informa ip e mac address
 port Informa portas TCP, UDP ou ambas.
 net Informa endereço de rede.
 ip,port Informa ip e porta.
 net,port Informa rede e porta.

Existem outros, mas para o nosso Post não há necessidade, pois queremos facilitar e
não criar um novo estudo sobre uma ferramenta. Não é ?

E o quer seria o método. Método é a forma de armazenar os dados dos tipos


escolhidos. Temos 3 métodos:

 bitmap
 list
 hash

Os tipos bitmap e listas usam um armazenamento limitado. O bitmap armazena itens


em uma região de memória especifica e não pode ultrapassar o tamanho de 65.536 itens. Já o
da list é menor ainda, somente 8, mas não utilizado como os outros. Ele aceita somente um
tipo especifico que é o set, em outras palavras ele agrupa os sets que foram criados em uma
lista. Tipo uma um set que contem sets, uma superlist de sets criados anteriormente. (Quando
falamos set, estamos falando de um lista já criada).

E por fim o hash que tem tamanho padrão de 65.536, mas pode ser maior utilizando a
opção maxelem, e obviamente usa um hash para armazenar as informações.

Bom visto isso, podemos ver alguns exemplo de criação de listas (sets) e como
adicionar elementos à mesma. Pelo fato do hash não ter limitação, normalmente usamos o
próprio.

ipset create ips_internos hash:net


ipset add ips_internos 192.168.0.0/24
ipset add ips_internos 10.0.0.0/24
ipset add ips_internos 10.0.0.0/30 no match

Acima temos uma lista simples, onde incluem a rede 192.168.0.0/24, 10.0.0.24, e tem
como exceção a rede 10.0.0.0/30, numa set chamada ips_internos. Obviamente esse é só uma
lista, temos ainda que aplicar em uma regra de firewall. Neste exemplo usei o tipo net, por se
tratar apenas de redes e não ips isolados ou ranges.

Vamos a mais um exemplo:

ipset create DMZ hash:ip


ipset add DMZ 10.0.0.254
ipset add DMZ 10.0.0.253
ipset add DMZ 10.0.0.252
ipset add DMZ 10.0.0.100-10.0.0.150

Podemos ver acima que além de usar IPs individuais, consigo adicionar um range de
endereços. É possível visualizar suas listas com o comando ipset list. Veja a saída de exemplo
abaixo:

Vejamos um exemplo, usando uma dupla, como ip e mac, para um range especifico da
rede.

ipset create ipmac_list bitmap:ip,mac range 192.168.10.0/24


ipset add ipmac_list 192.168.10.100,08:09:AA:FA:12:13
ipset add ipmac_list 192.168.10.100,08:09:AB:AF:12:18

Neste exemplo acima, estamos usando o conjunto ip e mac, mas note que usei o
método bitmap. O único método que permite o uso desta dupla é justamente o bitmap,
possuem outros tipos para esse método. Para uma consulta sobre todos tipos suportados por
cada método de uma olhada no man page em https://linux.die.net/man/8/ipset.

Por exemplo, o método hash, suporta net-port, ip-port, entre outros, vejamos um
exemplo.

ipset create ipport_list hash:ip,port


ipset add ipport_list 200.0.0.10,tcp:80
ipset add ipport_list 8.8.8.8,udp:53
ipset add ipport_list 10.0.0.0/24,111

Podemos ver no exemplo acima, que especifico um ip e uma porta tcp ou udp, mas
quando não especifico nada, no caso da porta 111, ele atribui tanto tcp como upd. E neste
momento não especifico se é origem ou destino. Farei isso na regra de firewall do iptables,
especificamente dentro do módulo set.

Aplicando os Set no iptables

Uma vez que tenhamos criados nossos sets, iremos então criar a regra de firewall
utilizando a opção –m set. Veja a sintaxe abaixo:

iptables ... –m set --match set <nome_da_lista> src|dst

Criamos a regra de firewall normalmente, colocando na cadeia especifica (INPUT,


OUTPUT ou FORWARD), e especificamos no módulo set, qual o nome da lista, e se será filtrado
na origem ou destino.

Vamos o exemplo da DMZ. Normalmente fazemos um NAT (DNAT) e depois precisamos


especificar as regras de forward para permitir o trafego. Usemos como exemplo nosso set
criado anteriormente DMZ, passando por nosso firewall indo para DMZ.

iptables –A FORWARD -m set --match-set DMZ dst –j ACCEPT


iptables –A FORWARD -m set --match-set DMZ src -m state --state ESTABLISHED,RELATED -j
ACCEPT

No exemplo acima temos duas regras, a primeira permite chegar pacotes com destino
a nossa lista DMZ, e o segundo permite sair pacotes com origem em nossa DMZ, desde que já
tenham conexão estabelecida ou Relacionada. Adicionei mais um módulo somente para
mostrar que ainda é possível utilizar-se de outros módulos ao mesmo tempo que usamos o set.

Para um segundo exemplo pegamos o set ips_internos, que não permito chegar a
determinado ips , por exemplo de servidores. Alias poderíamos criar um set também para os
servidores. Vamos então a um exemplo mais completo, do inicio da criação dos set, até as
regras de firewall.

ipset create ips_internos hash:net


ipset add ips_internos 192.168.0.0/24
ipset add ips_internos 10.0.0.0/24
ipset add ips_internos 10.0.0.0/30 no match

ipset create ips_servidores_ssh hash:ip,port


ipset add ips_servidores_ssh 10.0.0.100,tcp:22
ipset add ips_servidores_ssh 10.0.0.101,tcp:22

ipset create ips_servidores_web hash:ip,port


ipset add ips_servidores_web 10.0.0.100,80
ipset add ips_servidores_web 10.0.0.100,443
ipset add ips_servidores_web 10.0.0.101,80
ipset add ips_servidores_web 10.0.0.101,80

iptables -A FORWARD –m set --match-set ips_internos src –m set --match-set


ips_servidores_ssh dst -j REJECT
iptables –A FORWARD -s 10.0.0.0/30 -m set --match-set ips_servidores_web dst –j ACCEPT
iptables –A FORWARD -m set --match-set ips_internos src -m set --match-set
ips_servidores_web dst –j ACCEPT

Criamos 3 sets: ips_internos, ips_servidores_ssh, ips_servidores_web. Os ips_internos,


dão exceção à rede 10.0.0.0/30, ou seja, se o firewall aplicar DROP nos ips_internos, essa rede
terá acesso, e vice-versa. Com isso, tivemos que criar uma regra adicional liberando essa rede
para ips_servidores_web, antes de aplicar para todos ips_internos.

A primeira regra bloqueia acesso à porta 22 ssh dos servidores com exceção da rede
10.0.0.30. A segunda regra libera a rede 10.0.0.30 as porta 80 e 443 dos servidores, e por fim a
ultima regra libera acesso dos ip_internos, com exceção de 10.0.0.0/30 as portas 80 e 443 dos
servidores.

Por causa desta ultima regra, tive que criar uma segunda liberando a rede 10.0.0.0/30.

Adicional

Além do que vimos em relação ao ipset, existem muitas opções que podem ser
exploradas, como salvar através do save, restaurar através do restore, testar ou validar
conteúdo de set através do test e muito mais. De uma olhada no man page no ipset para
explorar mais ainda as suas funcionalidades.

Um grande abraço

André Stato Filho

Você também pode gostar