[iptables] Montando regras iptables

Abordarei nesse artigo algumas definições sobre tabelas, chains, comandos, ações e alvos do iptables para facilitar a criação de suas regras.

Tabelas

Tabela FILTER

É a tabela responsável pelos filtros dos pacotes. Ela se divide em 3 chains padrão.

INPUT

A chain INPUT é responsável por filtrar todo o tráfego que entra no firewall.

FORWARD

A chain FORWARD é responsável por filtrar todo o tráfego que passará pelo firewall, ou seja, todos os pacotes onde o NAT será aplicado.

OUTPUT

A chain OUTPUT é responsável por filtrar todo o tráfego que sairá pelo firewall.

Tabela NAT

É a tabela responsável pelo redirecionamento de pacotes. Ela também se divide em 3 chains.

PREROUTING

A chain PREROUTING é utilizada para alterar pacotes antes que os mesmos sejam roteados.

OUTPUT

A chain OUTPUT é utilizada para alterar os pacotes que se originam no firewall.

POSTROUTING

A chain POSTROUTING é utilizada pala alterar pacotes que já sofreram roteamento.

Tabela MANGLE

É a tabela responsável pela alteração de prioridade na entrada e saída de pacotes, baseando-se no tipo de serviço (TOS). É dividida em 2 chains.

PREROUTING

A chain PREROUTING trata a prioridade de pacotes antes de passarem por roteamento.

OUTPUT

A chain OUTPUT trata pacotes originados localmente no firewall antes que sejam roteados.

Comandos e ações

Comandos

-A

Adiciona uma regra no fim da lista.

-D

Apaga uma regra da lista.

-L

Lista as regras da lista.

-P

Altera a política padrão das Chains.

-F

Remove todas as regras da lista.

-I

Insere uma regra no início da lista.

-R

Substitui uma regra da lista por outra.

-N

Cria uma nova chain na tabela especificada.

-E

Renomeia uma chain que foi criada com o comando -N.

-X

Apaga uma chain criada com o comando -N.

Ações

-p

Especifica o protocolo ao qual a regra se aplicará. Também podemos utilizar o valor numérico que referencia o protocolo em /etc/protocol. Exemplo: -p gre ; -p 47

-i

Especifica a interface de entrada utilizada pela regra. Pode ser utilizada apenas com as chains INPUT e FORWARD. Exemplo: -i eth0 ou -i eth+ para especificar todas as entradas.

-o

Especifica a interface de saída utilizada pela regra. Pode ser utilizada apenas com as chains FORWARD e OUTPUT. Exemplo: -o eth0

-s

Especifica o endereço ou a rede de origem utilizada pela regra. Se não especificarmos a máscara de rede, o iptables utiliza a máscara padrão da classe C 255.255.255.0. Também podemos utilizar nomes DNS. Exemplo: -s 192.168.0.1; -s 192.168.0.0/255.255.255.0 -s vivaolinux.com.br

-d

Especifica o endereço ou a rede de destino utilizado pela regra. Se utiliza da mesma maneira que a ação -s.

!

Utilizado para especificar exceções. Exemplo: -s ! 192.168.0.5 # A regra se aplicaria a todos os ips que tivessem origem diferente de 192.168.0.5.

-j

Utilizado para aplicar um alvo a regra, os mesmos podem ser ACCEPT, DROP, REJECT e LOG. Exemplo: -j ACCEPT

--sport

Especifica a porta de origem utilizada. Só podemos aplicar a ação quando estivermos tratando dos protocolos tcp e udp. Exemplo: -p tcp --sport 25

--dport

Especifica a porta de destino utilizada. Funciona da mesma forma que a ação --sport. Exemplo: -p tcp --dport 25.

Alvos e módulos

Alvos

Quando temos um pacote que combinou com todas as opções da regra, necessitamos especificar um destino para o mesmo, como vimos anteriormente podemos especificar os seguintes alvos/destinos:

ACCEPT

Aceita a entrada ou passagem do pacote.

DROP

Descarta o pacote.

REJECT

Descarta o pacote, porém diferente de DROP, ele retorna uma mensagem ao emissor informando o que houve com o pacote.

LOG

Gera um log no sistema.

RETURN

Retorna o processamento da chain anterior.

QUEUE

Encarrega um programa de administrar o fluxo atribuído ao mesmo.

SNAT

Altera o endereço de origem do pacote.

DNAT

Altera o endereço de destino do pacote.

REDIRECT

Redireciona a porta do pacote juntamente com a opção --to-port.

TOS

Prioriza a entrada e saída de pacotes baseado em seu tipo de serviço.

Podemos especificar em TOS os seguintes valores:

  • 16 ou 0x10 - Espera mínima;
  • 8 ou 0x08 - Máximo processamento;
  • 4 ou 0x04 - Máxima confiança;
  • 2 ou 0x02 - Custo mínimo;
  • 0 ou 0x00 - Prioridade normal.


Módulos

A utilização de módulos junto com o iptables é definida através da opção -m.

Podemos utilizar os seguintes módulos:

limit

Impõe um limite de vezes que a regra poderá ser executada. state Utiliza o estado da conexão, que pode ser NEW, ESTABLISHED, RELATED, INVALID. mac Permite a utilização do endereço mac nas regras. multiport Permite a utilização de até 15 portas em uma única regra em conjunto com o --dport. string Verifica o conteúdo do pacote para aplicar a regra. owner Verifica o usuário que criou o pacote.

Exemplo de aplicação básica

Abaixo exemplos de algumas regras de firewall. Basta utilizar as informações anteriores e adequá-las a sua real necessidade:

#limpa todas as regras
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F

#exclui chains criadas
iptables -t filter -X
iptables -t nat -X
iptables -t mangle -X

#zera contador
iptables -t filter -Z
iptables -t nat -Z
iptables -t mangle -Z

#define política padrão para DROP
#se não especificar a tabela com -t, o iptables utilizará a tabela filter
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

#INPUT
#libera entrada para serviços locais do firewall
iptables -A INPUT -i lo -j ACCEPT #libera tráfego local
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT #libera Squid
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT #libera DNS
iptables -A INPUT -m state ESTABLISHED, RELATED -j ACCEPT #libera pacotes sincronizados
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT #libera ping.

#OUTPUT
iptables -A OUTPUT -j ACCEPT #libera toda a saída

#FORWARD
iptables -N INT2EXT #Cria chain INT2EXT para tratar a saída do tráfego
iptables -N EXT2INT #Cria chain EXT2INT para tratar a entrada do tráfego.
iptables -A FORWARD -i eth0 -o eth1 -j EXT2INT #aceita tráfego de entrada especificado em EXT2INT
iptables -A FORWARD -i eth1 -o eth0 -j INT2EXT #aceita tráfego de saída especificado em INT2EXT

iptables -A INT2EXT -p tcp -s 192.168.0.10 -j ACCEPT #libera o host 192.168.0.10 a sair por qualquer porta tcp
iptables -A INT2EXT -p tcp -m multiport --dport 25,110 -j ACCEPT #libera envio e recebimento de email para a rede

iptables -A EXT2INT -p tcp --dport 80 -j ACCEPT #libera entrada para serviço web.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.10:80 #direciona tráfego http para para o host 192.168.0.10

iptables -t mangle -A INPUT -p tcp --dport 80 -j TOS --set-tos 16 #prioriza tráfego na porta 80

Fonte: http://www.htmlstaff.org/ver.php?id=21373

.