Guia do Linux/Avançado/Firewall iptables/Caminho percorrido pelos pacotes nas tabelas e chains

Origem: Wikilivros, livros abertos por um mundo aberto.

Caminho percorrido pelos pacotes nas tabelas e chains[editar | editar código-fonte]

É 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.

Ping de 192.168.1.1 para 192.168.1.1[editar | editar código-fonte]

    • 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.

Conexão FTP de 192.168.1.1 para 192.168.1.1[editar | editar código-fonte]

    • 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.

Conexão FTP de 192.168.1.1 para 192.168.1.4[editar | editar código-fonte]

    • 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.

Conexão FTP de 200.217.29.67 para a máquina ftp.debian.org.br[editar | editar código-fonte]

    • 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.

Ping de 192.168.1.4 para 192.168.1.1[editar | editar código-fonte]

    • 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.

Conexão FTP de 192.168.1.4 para 192.168.1.1[editar | editar código-fonte]

    • 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.

Conexão FTP de 192.168.1.4 para ftp.debian.org.br[editar | editar código-fonte]

    • 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.

Conexão FTP de 200.198.129.162 para 200.217.29.167[editar | editar código-fonte]

    • 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.

Gráfico geral da passagem dos pacotes[editar | editar código-fonte]

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              |
                          ----------------------------------------