É MUITO importante entender a função de cada filtro e a ordem de acesso dos chains de acordo com o tipo de conexão e interface de origem/destino. Esta seção explica a ordem que as regra são atravessadas, isso lhe permitirá planejar a distribuição das regras nos chains, e evitar erros de localização de regras que poderia deixar seu firewall com sérios problemas de segurança, ou um sistema de firewall totalmente confuso e sem lógica.
Nos exemplos abaixo assumirei a seguinte configuração:
A máquina do firewall com iptables possui o endereço IP
192.168.1.1
e conecta a rede interna ligada via interface
eth0
a internet via a interface ppp0
.
Rede interna com a faixa de endereços 192.168.1.0
conectada ao firewall via interface eth0
Interface ppp0
fazendo conexão com a Internet com o
endereço IP 200.217.29.67
.
A conexão das máquinas da rede interna (eth0
) com a rede
externa (ppp0
) é feita via
Masquerading.
Também utilizarei a sintaxe CHAIN-tabela para fazer referência aos chains e tabelas dos blocos ASCII: INPUT-filter - chain INPUT da tabela filter.
ATENÇÃO: A ordem de processamento das regras do iptables, é diferente do ipchains devido a inclusão do novo sistema de nat e da tabela mangle.
Endereço de Origem: 192.168.1.1
Endereço de Destino: 192.168.1.1
Interface de Entrada: lo
Interface de Saída: lo
Protocolo: ICMP
Descrição: Ping para o próprio firewall
SAÍDA DE PACOTES (envio do ping para 192.168.1.1): +-------------+ +----------+ +-------------+ +------------------+ +----------------+ |OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| =>|POSTROUTING-mangle|=>|POSTROUTING-nat | +-------------+ +----------+ +-------------+ +------------------+ +----------------+ ENTRADA DOS PACOTES (Retorno da resposta ping acima): +-----------------+ +------------+ +------------+ |PREROUTING-mangle| =>|INPUT-mangle|=>|INPUT-filter| +-----------------+ +------------+ +------------+
Quando damos o ping (echo request) os pacotes seguem o caminho em SAÍDA DE PACOTES percorrendo os chains na ordem especificada e retornam via ENTRADA DOS PACOTES (echo reply). No envio da resposta da requisição de ping, o caminho de saída do pacote ignora os chains OUTPUT-nat e POSTROUTING-nat (já que não é necessário nat) mas sempre processa os chains correspondentes da tabela mangle na ordem indicada acima.
OBS1: Para conexões com destinos na própria
máquina usando um endereço IP das interfaces locais, a interface será ajustada
sempre para lo
(loopback).
OBS2: Em qualquer operação de entrada/saída de pacotes, os dois chains da tabela mangle são sempre os primeiros a serem acessados. Isto é necessário para definir a prioridade e controlar outros aspectos especiais dos pacotes que atravessam os filtros.
OBS3: O chain OUTPUT da tabela filter é consultado sempre quando existem conexões se originando em endereços de interfaces locais.
Endereço de Origem: 192.168.1.1
Endereço de Destino: 192.168.1.1
Interface de Origem: lo
Interface de Destino: lo
Porta Origem: 1404
Porta Destino: 21
Protocolo: TCP
Descrição: Conexão ftp (até o prompt de login, sem transferência de
arquivos).
SAÍDA DOS PACOTES (envio da requisição para 192.168.1.1): +-------------+ +----------+ +-------------+ +------------------+ +---------------+ |OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| => +POSTROUTING-mangle| => |POSTROUTING-nat| +-------------+ +----------+ +-------------+ +------------------+ +---------------+ ENTRADA DE PACOTES (respostas da requisição vindas de 192.168.1.1): +-----------------+ +------------+ +------------+ |PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +------------+ +------------+
A requisição ftp passa através dos chains especificados em SAÍDA DOS PACOTES e retorna por ENTRADA DE PACOTES. Após a conexão ser estabelecida, o caminho de SAÍDA DE PACOTES será:
+-------------+ +-------------+ +------------------+ |OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle| +-------------+ +-------------+ +------------------+
pois os dados de entrada que vem da interface externa, são passados diretamente a máquina do firewall, não necessitando de tratamento SNAT (os chains OUTPUT-nat e POSTROUTING-nat são processado somente uma vez a procura de regras que conferem, principalmente para fazer SNAT). Note novamente que mesmo não sendo necessário NAT, o chain POSTROUTING-mangle é checado.
OBS1: Para conexões com destinos na própria
máquina usando um endereço IP das interfaces locais, a interface será ajustada
sempre para lo
(loopback).
OBS2: Em qualquer operação de entrada/saída de pacotes, os dois chains da tabela mangle são sempre os primeiros a serem acessados. Isto é necessário para definir a prioridade e controlar outros aspectos especiais dos pacotes que atravessam os filtros.
Endereço de Origem: 192.168.1.1
Endereço de Destino: 192.168.1.4
Interface de Origem: eth0
Interface de Destino: eth0
Porta Origem: 1405
Porta Destino: 21
Protocolo: TCP
Descrição: Conexão ftp (até o prompt de login, sem transferência de
arquivos).
SAÍDA DOS PACOTES (envio da requisição para 192.168.1.4): +-------------+ +----------+ +-------------+ +------------------+ +---------------+ |OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| => +POSTROUTING-mangle| => |POSTROUTING-nat| +-------------+ +----------+ +-------------+ +------------------+ +---------------+ ENTRADA DE PACOTES (respostas da requisição de 192.168.1.4): +-----------------+ +------------+ +------------+ |PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +------------+ +------------+
A requisição ftp passa através dos chains especificados em SAÍDA DOS
PACOTES com o destino 192.168.1.4
porta
21
e retorna por ENTRADA DE PACOTES
para 192.168.1.1
porta 1405
. Após a
conexão ser estabelecida, o caminho de SAÍDA DE PACOTES
será:
+-------------+ +-------------+ +------------------+ |OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle| +-------------+ +-------------+ +------------------+
pois os dados não precisam de tratamento SNAT (os chains OUTPUT-nat e POSTROUTING-nat são processado somente uma vez a procura de regras que conferem, principalmente para fazer SNAT).
OBS: Em qualquer operação de entrada/saída de pacotes, os dois chains da tabela mangle são sempre os primeiros a serem acessados. Isto é necessário para definir a prioridade e controlar outros aspectos especiais dos pacotes que atravessam os filtros.
Endereço de Origem: 200.217.29.67
Endereço de Destino: 200.198.129.162
Interface de Origem: ppp0
Interface de Destino: ppp0
Porta Origem: 1407
Porta Destino: 21
Protocolo: TCP
Descrição: Conexão ftp (até o prompt de login, sem transferência de
arquivos).
SAÍDA DOS PACOTES (envio da requisição para 200.198.129.162): +-------------+ +----------+ +-------------+ +------------------+ +---------------+ |OUTPUT-mangle| => |OUTPUT-nat| => |OUTPUT-filter| => +POSTROUTING-mangle| => |POSTROUTING-nat| +-------------+ +----------+ +-------------+ +------------------+ +---------------+ ENTRADA DE PACOTES (respostas da requisição vindas de 200.198.129.162): +-----------------+ +------------+ +------------+ |PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +------------+ +------------+
A requisição ftp passa através dos chains especificados em SAÍDA DOS
PACOTES com o destino 200.198.129.162
porta
21
(após a resolução DNS de
www.debian.org.br
) e retorna por ENTRADA DE
PACOTES para 200.217.29.67
porta
1407
. Após a conexão ser estabelecida, o caminho de saída
de pacotes é:
+-------------+ +-------------+ +------------------+ |OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle| +-------------+ +-------------+ +------------------+
pois os dados não precisam de tratamento SNAT (os chains OUTPUT-nat e POSTROUTING-nat são processado somente uma vez a procura de regras que conferem, principalmente para fazer SNAT).
E após a conexão estabelecida, o caminho de entrada de pacotes passa a ser:
+-----------------+ +------------+ +------------+ |PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +------------+ +------------+
pois os dados não precisam de tratamento DNAT (o chain PREROUTING-nat é processado somente uma vez a procura de regras que conferem, principalmente para fazer DNAT).
OBS: Para qualquer operação de entrada/saída de pacotes, os dois chains da tabela mangle são sempre os primeiros a serem acessados. Isto é necessário para definir a prioridade e controlar outros aspectos especiais dos pacotes que atravessam os filtros.
Endereço de Origem: 192.168.1.4
Endereço de Destino: 192.168.1.1
Interface de Entrada: eth0
Interface de Saída: eth0
Protocolo: ICMP
Descrição: Ping de 192.168.1.4 para a máquina do firewall.
ENTRADA DE PACOTES (recebimento da requisição, vinda de 192.168.1.4): +-----------------+ +--------------+ +------------+ +------------+ |PREROUTING-mangle| => |PREROUTING-nat| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +--------------+ +------------+ +------------+ SAÍDA DE PACOTES (envio da resposta a 192.168.1.4) +-------------+ +-------------+ +------------------+ |OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle| +-------------+ +-------------+ +------------------+
Quando damos o ping (echo request) os pacotes seguem o caminho em ENTRADA DE PACOTES percorrendo os chains na ordem especificada e retornam via SAÍDA DOS PACOTES (echo reply).
OBS1: Para qualquer operação de entrada/saída de pacotes, os dois chains da tabela mangle são sempre os primeiros a serem acessados. Isto é necessário para definir a prioridade e controlar outros aspectos especiais dos pacotes que atravessam os filtros.
Endereço de Origem: 192.168.1.4
Endereço de Destino: 192.168.1.1
Interface de Origem: eth0
Interface de Destino: eth0
Porta Origem: 1030
Porta Destino: 21
Protocolo: TCP
Descrição: Conexão ftp (até o prompt de login, sem transferência de
dados).
ENTRADA DOS PACOTES (envio da requisição vindas de 192.168.1.4): +-----------------+ +--------------+ +------------+ +------------+ |PREROUTING-mangle| => |PREROUTING-nat| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +--------------+ +------------+ +------------+ SAÍDA DE PACOTES (respostas da requisição acima para 192.168.1.4): +-------------+ +-------------+ +------------------+ |OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle| +-------------+ +-------------+ +------------------+
A requisição ftp passa através dos chains especificados em ENTRADA
DOS PACOTES com o destino 192.168.1.1
porta
21
e retorna por SAÍDA DE PACOTES
para 192.168.1.4
porta 1030
. Após a
conexão ser estabelecida, o caminho de entrada de pacotes é:
+-----------------+ +------------+ +------------+ |PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +------------+ +------------+
pois os dados não precisam de tratamento DNAT (o chain PREROUTING-nat é processado somente uma vez a procura de regras que conferem, principalmente para fazer DNAT).
OBS: O roteamento é sempre realizado após o processamento do chain PREROUTING da tabela nat.
Endereço de Origem: 192.168.1.4
Endereço de Destino: 200.198.129.162
Interface de Origem: eth0
Interface de Destino: ppp0
Porta Origem: 1032
Porta Destino: 21
Protocolo: TCP
Descrição: Conexão ftp (até o prompt de login, sem transferência de
dados).
SAÍDA DOS PACOTES (requisição vindas de 192.168.1.4): +-----------------+ +--------------+ +--------------+ |PREROUTING-mangle| => |PREROUTING-nat| => |FORWARD-mangle| => (continua abaixo) +-----------------+ +--------------+ +--------------+ +--------------+ +------------------+ +---------------+ |FORWARD-filter| => |POSTROUTING-mangle| => |POSTROUTING-nat| +--------------+ +------------------+ +---------------+ ENTRADA DE PACOTES (respostas da requisição acima, enviadas para 192.168.1.4): +-----------------+ +--------------+ +--------------+ +------------------+ |PREROUTING-mangle| => |FORWARD-mangle| => |FORWARD-filter| => |POSTROUTING-mangle| +-----------------+ +--------------+ +--------------+ +------------------+
A requisição ftp passa através dos chains especificados em SAÍDA DOS
PACOTES com o destino 200.198.129.162
porta
21
(após a resolução DNS de
ftp.debian.org.br
) e retorna por ENTRADA DE
PACOTES para 192.168.1.4
porta
1032
.
Note que o Masquerading regrava os pacotes; para a máquina
200.198.129.162
a conexão está sendo feita para
200.217.29.67
. As respostas de conexões vindas de
200.198.129.162
e indo para
200.217.29.67
são regravadas no firewall com o destino
192.168.1.4
e enviadas para a máquina correspondente.
Após a conexão ser estabelecida, o caminho de saída de pacotes para
200.198.129.163 é:
+-----------------+ +--------------+ +--------------+ +------------------+ |PREROUTING-mangle| => |FORWARD-mangle| => |FORWARD-filter| => |POSTROUTING-mangle| +-----------------+ +--------------+ +--------------+ +------------------+
Após a conexão estabelecida, o caminho da entrada de pacotes vindos de 200.198.129.163 é:
+-----------------+ +--------------+ +--------------+ +------------------+ |PREROUTING-mangle| => |FORWARD-mangle| => |FORWARD-filter| => |POSTROUTING-mangle| +-----------------+ +--------------+ +--------------+ +------------------+
Isto acontece porque após feita a conexão Masquerading (via PREROUTING-nat), o
firewall já sabe como reescrever os pacotes para realizar a operação de
Masquerading, reescrevendo todos os pacotes que chegam de
www.debian.org.br
para 192.168.1.4
.
OBS: As conexões Masquerading feitas através
da rede interna, são enviadas para 200.198.129.162
tem o
endereço de origem ajustado para 200.217.29.67
que é o IP
de nossa interface ppp0
. Quando as respostas atravessam o
firewall, os pacotes são checados pra saber se são uma resposta a uma conexão
masquerading e fará a regravação dos pacotes substituindo o endereço de destino
para 192.168.1.4
. Caso uma operação de Masquerading
falhe, os pacotes serão Bloqueados.
Endereço de Origem: 200.198.129.162
Endereço de Destino: 200.217.29.67
Interface de Origem: ppp0
Interface de Destino: ppp0
Porta Origem: 3716
Porta Destino: 21
Protocolo: TCP
Descrição: Conexão ao serviço ftp do firewall
ENTRADA DOS PACOTES (requisição vinda de 200.198.129.162): +-----------------+ +--------------+ +-------------+ +------------+ |PREROUTING-mangle| => |PREROUTING-nat| => |INPUT-mangle | => |INPUT-filter| +-----------------+ +--------------+ +-------------+ +------------+ SAÍDA DE PACOTES (respostas da requisição de 200.198.129.162): +-------------+ +-------------+ +------------------+ |OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle| +-------------+ +-------------+ +------------------+
A requisição ftp passa através dos chains especificados em ENTRADA
DOS PACOTES com o destino 200.217.29.67
(nossa
interface ppp0
local) porta 21
e
retorna por SAÍDA DE PACOTES para
200.198.129.162
porta 3716
(também
via ppp0
). Após a conexão ser estabelecida, o caminho de
entrada de pacotes é:
+-----------------+ +------------+ +------------+ |PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter| +-----------------+ +------------+ +------------+
Isto acontece porque após feita a análise do chain PREROUTING (para necessidade de DNAT), a máquina já saberá tomar a decisão apropriada para gerenciar aquela conexão.
Este gráfico foi retirado do documento
netfilter-hacking-HOWTO.txt
e mostra a estrutura geral de
passagem dos pacotes nas tabelas/chains. Os exemplos de passagem de pacotes
acima poderão ser facilmente comparados com as etapas abaixo para compreender a
estrutura do iptables.
E ---> PREROUTING ------> (ROTEAM.) ---> FORWARD ----------> POSTROUTING --> S Mangle e | Mangle ^ Mangle NAT (DNAT)) | Filter | NAT (SRC) | (ROTEAM.) v | IN Mangle, OUT - Mangle, | Filter ^ NAT (DNAT) | | Filter v | +----------------------------------------+ | Processo Local | +----------------------------------------+
Copyright © 1999-2020 - Gleydson Mazioli da Silva