Conhecendo o Iptables – O que é? Como Funciona? – Parte 1


Olá, 🖖🏼 Neste post iremos abordar o que é o IPTABLES e como ele funciona.

As características do Iptables:

  • Suporte aos Protocolos TCP, UDP, ICMP.
  • Pode especificar portas de endereço e destino.
  • Suporte aos módulos externos, como FTP e IRC.
  • Suporta um número ilimitado de regras por CHAINS ( correntes ).
  • Pode se criar regras de proteção contra diversos tipos de ataques.
  • Suporte para roteamento de pacotes e redirecionamentos de portas.
  • Suporta vários tipos de NAT, como o SNAT e DNAT e mascaramento.
  • Pode priorizar tráfego para determinados tipos de pacotes.
  • Tem suporte a IPV6, através do programa ‘ip6tables’.

Como Funciona:

O Iptables funciona através de regras, podemos fazer com que os pacotes possam ser ou não recebidos em nossa rede ou algum host. Trabalha através de Tabelas, chains e Regras. Então vamos conhecer como isso funciona.

Tabelas:

Atualmente existem 3 tabelas possíveis de serem usadas no Iptables, sendo uma delas, a mangle, que é usada com pouca frequência, restando assim a filter, que é a padrão, podemos usar em tráfegos de dados comuns, quando não ocorre NAT. Quando não especificamos qual a tabela a ser utilizada é que será ativada. A outra geralmente utilizada é a ‘nat’, que como o nome diz, é utilizada em ocorrência de NAT.

Chains:

Através das chains podemos especificar uma situação do tratamento de pacotes, seja em qualquer tabela. Quando usamos a tabela nat as Chains possíveis são:

  • PREROUTING: Quando os pacotes entram para sofrerem NAT.
  • POSTROUTING: Quando os pacotes estão saindo após sofrerem o NAT.
  • OUTPUT: Pacotes que são gerados na própria máquina e que sofrerão NAT.

Já na tabela filter as Chains são:

  • INPUT: Pacotes cujo o destino final é a própria maquina firewall.
  • OUTPUT: Pacotes que saem da máquina firewall.
  • FORWARD: Pacote que atravessa a máquina firewall, cujo o destino é outra máquina. Este tipo de pacote não sai da máquina firewall e sim de outra máquina da rede ou fonte. Em casos assim a máquina firewall está repassando o pacote.

Veja abaixo uma simples referência:

               --------------------- --------------------------------
       TABELA  |      CHAIN          |            INTERFACE           |
               |                      ---------------- ---------------
               |                     |  ENTRADA (-i)  |    SAÍDA (-o) |
      --------- --------------------- ---------------- ---------------
     |         |  INPUT              |      SIM       |      NÃO      |
     | filter  |  OUTPUT             |      NÃO       |      SIM      |
     |         |  FORWARD            |      SIM       |      SIM      |
      --------- --------------------- ---------------- ---------------
     |         | PREROUTING          |      SIM       |      NÃO      |
     | nat     | OUTPUT              |      NÃO       |      SIM      |
     |         | POSTROUTING         |      NÃO       |      SIM      |
      --------- --------------------- ---------------- ---------------
     |         | PREROUTING          |      SIM       |      NÃO      |
     | mangle  |                     |                |               |
     |         | OUTPUT              |      NÃO       |      SIM      |
      --------- --------------------- ---------------- ---------------

As Regras

Geralmente as regras de firewall são composta da seguinte maneira “Tabela + opção + chain + dados + ação”. Através destes elementos podemos especificar o que fazer com os pacotes.

Opções:

  • -P Define uma regra padrão.
  • -A Adiciona uma nova regra as existentes. Este tem prioridade sobre a -P.
  • -D Apaga uma regra.
  • -L Lista as regras existentes.
  • -F Limpa todas as regras.
  • -I Insere uma nova regra.
  • -h Exibe a ajuda.
  • -R Substitui uma regra.
  • -C Faz a checagem das regras existentes.
  • -Z Zera uma regra específica.
  • -N Cria uma nova regra com um nome.
  • -X Exclui uma regra específica pelo seu nome.

Dados:

  • -s Especifíca a origem do pacote. Este poder ser um host ou uma rede, veja o exemplo abaixo: -s 192.168.0.0/255.255.255.0 ou -s 192.168.0.0/24

Observação: No segundo caso estamos especificando a máscara de rede conforme o número de bits, por exemplo:

  • Máscara de rede 255.0.0.0 8
  • Máscara de rede 255.255.0.0 16
  • Máscara de rede 255.255.255.0 24

No exemplo acima estamos especificando toda uma rede da Classe C, no exemplo abaixo vamos especificar um host:

-s 192.168.30.51/255.255.255.255 ou -s 192.168.30.51 poderia ficar assim: -s 192.168.30.51/32

Observação: A máscara em número de bit 1 para host é 32.

Podemos especificar também:

-s www.google.com.br

Veja um exemplo na prática:

iptables -t filter -A INPUT -p tcp -s 192.168.0.0/24 -j ACCEPT

Podemos especificar qualquer origem também:

-s 0.0.0.0/0.0.0.0 ou -s 0/0

  • -d Especifica o destino do pacote. A sintaxe é a mesma do ‘-s’.

Veja o exemplo abaixo:

iptables -t filter -A INPUT -p tcp -d 192.168.0.0/24 -j ACCEPT
  • -i Interface de entrada, ou seja, placa de rede, modem ou interface de conexão que estará recebendo o pacote a ser tratado.
  • -i eth0.
  • -i eth1.
  • -i eth2.
  • -i ppp0.
  • -o Interface de saída. As sintaxes são as mesmas que ‘-i’, sendo que neste caso estará enviando o pacote a ser tratado.
  • -o eth0
  • -o eth1
  • -o eth2
  • -o ppp0
  • ! Exclui um determinado argumento.
  • -i!eth0 – Refere-se a qualquer interface de entrada exceto a eth0
  • -s!192.168.0.45 – Refere-se a qualquer endereço de entrada exceto o 192.168.0.45

–sport Refere-se a porta de origem. Este deve ser acompanhado das funções ‘-p tcp’ e ‘-p udp’. -p tcp –sport 80 – Refere-se a porta de origem 80 sob o protocolo TCP.

–dport Refere-se a porta destino. Assim como a função –sport, ela trabalha somente com a ‘-p tcp’ e ‘-p udp’. A sintaxe é similar a –sport. Através das funções –sport e –dport podemos especificar não só uma porta especifica como também um range de portas:

–sport 33435:33525

As Ações.

Sempre vem após o parâmetro ‘-j’ e geralmente são:

  • ACCEPT Aceita e permite a passagem de pacote.
  • DROP Não permite a passagem do pacote e abandona-o não dando sinais de recebimento.
  • REJECT Assim como o DROP, não permite a passagem do pacote, mais envia um aviso ( icmp unreachable ).
  • LOG Cria um arquivo de Log.

Com estes fatores podemos criar as nossas Regras com a seguinte composição:

iptables -A FORWARD -s 192.168.0.45 -p icmp -j DROP

Sendo: -A (opção)/ FORWARD(Chain)/-s 192.168.0.45 -p icmp(Dados) /-j DROP(Ação)

No exemplo acima a regra determina que todos os pacotes icmp de origem no endereço 192.168.0.45 devem ser barrados.

Salvando as Regras.

Depois de executar as regras, precisamos salvá-las, para que quando se reinicie o servidor não precise ficar digitando as regras.

itpables-save > iptables-servidor-1

No caso iptables-servidor-1 é o nome que escolhi para salvar as regras, você pode colocar qualquer nome de sua preferência.

Para Recuperá-las:

iptables-restore > <nome do arquivo>

Outra forma seria fazer um script com as regras: Que na minha opinião é muito mais fácil e simples de manter o Firewall organizado. Veja abaixo um modelo de script:

#!/bin/bash

#limpando tabelas
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

#liberando acesso interno da rede
iptables -A INPUT -p tcp –syn -s 192.168.1.0/255.255.255.0 -j ACCEPT
iptables -A OUTPUT -p tcp –syn -s 192.168.1.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -p tcp –syn -s 192.168.1.0/255.255.255.0 -j ACCEPT

#compartilhando a web na rede interna
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

# Protecao contra port scanners ocultos
iptables -A INPUT -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

# Bloqueando traceroute
iptables -A INPUT -p udp -s 0/0 -i eth1 –dport 33435:33525 -j DROP

#Protecoes contra ataques
iptables -A INPUT -m state –state INVALID -j DROP

#termina
echo “Iptables Pronto”

Salve-o com um nome sugestivo, como por exemplo “start-firewall.sh” Dê permissão de execução:

chmod +x start-firewall.sh

Pronto. Toda vez que quiser que ele seja habilitado é só executá-lo ( sempre como root ):

./start-firewall.sh

Para não ter que ficar chamando o script toda vez que inicializar o sistema, podemos fazer com que ele seja ativado na inicialização. Para isso é preciso editar o arquivo ‘/etc/rc.d/rc.local’ e incluir o comando no final do arquivo.

Veja agora a Parte 2 sobre IPTables: [[http:tidahora.com.br/index.html/doku.php?idconhecendo_o_iptables_compartilhamento_de_conexao_mascaramento_e_redirecionamento_de_pacotes_parte_2 Compartilhamento de Conexão/Mascaramento e Redirecionamento de Pacotes]]

Dúvidas? Postem nos comentários!
👋🏼 Até a próxima!


Johnny Ferreira
johnny.ferreira.santos@gmail.com
http://www.tidahora.com.br


comments powered by Disqus