<sect id="fw-iptables-path">Caminho percorrido pelos pacotes nas tabelas e chains
 <p>
É 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. 
 <p>
Nos exemplos abaixo assumirei a seguinte configuração: 
<list compact>
 <item>
A máquina do firewall com <prgn>iptables</prgn> possui o endereço IP
<file>192.168.1.1</file>  e conecta a rede interna ligada via interface 
<file>eth0</file> a internet via a interface <file>ppp0</file>.

 <item>
Rede interna com a faixa de endereços <file>192.168.1.0</file> conectada ao 
firewall via interface <file>eth0</file> 
 
 <item>
Interface <file>ppp0</file> fazendo conexão com a Internet com o endereço IP 
<file>200.217.29.67</file>.

 <item>
A conexão das máquinas da rede interna (<file>eth0</file>) com a rede externa 
(<file>ppp0</file>) é feita via <em>Masquerading</em>.
</list>
Também utilizarei a sintaxe <em>CHAIN-tabela</em> para fazer referência aos chains
e tabelas dos blocos ASCII: <em>INPUT-filter</em> - chain <em>INPUT</em> da tabela 
<em>filter</em>. 

<![ %OBS [ 
 <p>
<strong>ATENÇÃO:</strong> A ordem de processamento das regras do <prgn>iptables</prgn>, é diferente do <prgn>ipchains</prgn> devido a inclusão do novo sistema de 
nat e da tabela mangle. ]]>



<sect1 id="fw-iptables-path-PingICMPLocal-Local">Ping de 192.168.1.1 para 192.168.1.1
 <p>
<list compact>
 <item>Endereço de Origem: <tt>192.168.1.1</tt>
 <item>Endereço de Destino: <tt>192.168.1.1</tt>
 <item>Interface de Entrada: <tt>lo</tt>
 <item>Interface de Saída: <tt>lo</tt>
 <item>Protocolo: <tt>ICMP</tt>
 <item>Descrição: <tt>Ping para o próprio firewall</tt>
</list>
<example>
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|
+-----------------+   +------------+  +------------+

</example>
Quando damos o ping (<em>echo request</em>) os pacotes seguem o caminho em 
<em>SAÍDA DE PACOTES</em> percorrendo os chains na ordem especificada e 
retornam via <em>ENTRADA DOS PACOTES</em> (<em>echo reply</em>). 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.
 <p>
<![ %OBS [
 <p>
<strong>OBS1:</strong> Para conexões com destinos na própria máquina usando um 
endereço IP das interfaces locais, a interface será ajustada sempre para 
<file>lo</file> (loopback). 
 <p>
<strong>OBS2:</strong> Em qualquer operação de entrada/saída de pacotes, os 
dois chains da tabela <em>mangle</em> 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. 
 <p>
<strong>OBS3:</strong> O chain <em>OUTPUT</em> da tabela <em>filter</em> é 
consultado sempre quando existem conexões se originando em endereços de 
interfaces locais. ]]>



<sect1 id="fw-iptables-path-FtpTCPLocal-Local">Conexão FTP de 192.168.1.1 para 192.168.1.1
 <p>
<list compact>
 <item>Endereço de Origem: <tt>192.168.1.1</tt>
 <item>Endereço de Destino: <tt>192.168.1.1</tt>
 <item>Interface de Origem: <tt>lo</tt>
 <item>Interface de Destino: <tt>lo</tt>
 <item>Porta Origem: <tt>1404</tt>
 <item>Porta Destino: <tt>21</tt>
 <item>Protocolo: <tt>TCP</tt>
 <item>Descrição: <tt>Conexão ftp (até o prompt de login, sem transferência de arquivos).</tt>
</list>
<example>
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|
+-----------------+    +------------+    +------------+

</example>
A requisição ftp passa através dos chains especificados em <em>SAÍDA DOS 
PACOTES</em> e retorna por <em>ENTRADA DE PACOTES</em>. 
Após a conexão ser estabelecida, o caminho de <em>SAÍDA DE PACOTES</em> será: 
<example>
+-------------+    +-------------+    +------------------+
|OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle|
+-------------+    +-------------+    +------------------+
</example>
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 <em>OUTPUT-nat</em> e <em>POSTROUTING-nat</em> 
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.
 <p>
<![ %OBS [
 <p>
<strong>OBS1:</strong> Para conexões com destinos na própria máquina usando um 
endereço IP das interfaces locais, a interface será ajustada sempre para 
<file>lo</file> (loopback). 
 <p>
<strong>OBS2:</strong> 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. ]]>



<sect1 id="fw-iptables-path-FtpTCPLocal-LocalNet">Conexão FTP de 192.168.1.1 para 192.168.1.4
 <p>
<list compact>
 <item>Endereço de Origem: <tt>192.168.1.1</tt>
 <item>Endereço de Destino: <tt>192.168.1.4</tt>
 <item>Interface de Origem: <tt>eth0</tt>
 <item>Interface de Destino: <tt>eth0</tt>
 <item>Porta Origem: <tt>1405</tt>
 <item>Porta Destino: <tt>21</tt>
 <item>Protocolo: <tt>TCP</tt>
 <item>Descrição: <tt>Conexão ftp (até o prompt de login, sem transferência de arquivos).</tt>
</list>
<example>
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|
+-----------------+    +------------+    +------------+

</example>
A requisição ftp passa através dos chains especificados em <em>SAÍDA DOS 
PACOTES</em> com o destino <file>192.168.1.4</file> porta <file>21</file> e 
retorna por <em>ENTRADA DE PACOTES</em> para <file>192.168.1.1</file> 
porta <file>1405</file>. Após a conexão ser estabelecida, o caminho de 
<em>SAÍDA DE PACOTES</em> será: 
<example>
+-------------+    +-------------+    +------------------+
|OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle|
+-------------+    +-------------+    +------------------+
</example>
pois os dados não precisam de tratamento SNAT (os chains <em>OUTPUT-nat</em> e 
<em>POSTROUTING-nat</em> são processado somente uma vez a procura de regras que 
conferem, principalmente para fazer SNAT). 
 <p>
<![ %OBS [
 <p>
<strong>OBS:</strong> 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. ]]>


<sect1 id="fw-iptables-path-FtpTCPLocal-RemoteNet">Conexão FTP de 200.217.29.67 para a máquina ftp.debian.org.br
 <p>
<list compact>
 <item>Endereço de Origem: <tt>200.217.29.67</tt>
 <item>Endereço de Destino: <tt>200.198.129.162</tt>
 <item>Interface de Origem: <tt>ppp0</tt>
 <item>Interface de Destino: <tt>ppp0</tt>
 <item>Porta Origem: <tt>1407</tt>
 <item>Porta Destino: <tt>21</tt>
 <item>Protocolo: <tt>TCP</tt>
 <item>Descrição: <tt>Conexão ftp (até o prompt de login, sem transferência de arquivos).</tt>
</list>
<example>
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|
+-----------------+    +------------+    +------------+

</example>
A requisição ftp passa através dos chains especificados em <em>SAÍDA DOS 
PACOTES</em> com o destino <file>200.198.129.162</file> porta 
<file>21</file> (após a resolução DNS de <file>www.debian.org.br</file>) 
e retorna por <em>ENTRADA DE PACOTES</em> para <file>200.217.29.67</file> 
porta <file>1407</file>. Após a conexão ser estabelecida, o caminho de saída 
de pacotes é: 
<example>
+-------------+    +-------------+    +------------------+
|OUTPUT-mangle| => |OUTPUT-filter| => |POSTROUTING-mangle|
+-------------+    +-------------+    +------------------+

</example>
pois os dados não precisam de tratamento SNAT (os chains <em>OUTPUT-nat</em> e 
<em>POSTROUTING-nat</em> são processado somente uma vez a procura de regras que 
conferem, principalmente para fazer SNAT).  
 <p>
E após a conexão estabelecida, o caminho de entrada de pacotes passa a ser: 
<example>
+-----------------+    +------------+    +------------+
|PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter|
+-----------------+    +------------+    +------------+

</example>
pois os dados não precisam de tratamento DNAT (o chain <em>PREROUTING-nat</em> 
é processado somente uma vez a procura de regras que conferem, principalmente 
para fazer DNAT). 
 <p>
<![ %OBS [
 <p>
<strong>OBS:</strong> 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. ]]>


<sect1 id="fw-iptables-path-PingICMPLocalNet-Local">Ping de 192.168.1.4 para 192.168.1.1
 <p>
<list compact>
 <item>Endereço de Origem: <tt>192.168.1.4</tt>
 <item>Endereço de Destino: <tt>192.168.1.1</tt>
 <item>Interface de Entrada: <tt>eth0</tt>
 <item>Interface de Saída: <tt>eth0</tt>
 <item>Protocolo: <tt>ICMP</tt>
 <item>Descrição: <tt>Ping de 192.168.1.4 para a máquina do firewall.</tt>
</list>
<example>
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|
+-------------+    +-------------+    +------------------+

</example>
Quando damos o ping (<em>echo request</em>) os pacotes seguem o caminho em 
<em>ENTRADA DE PACOTES</em> percorrendo os chains na ordem especificada e 
retornam via <em>SAÍDA DOS PACOTES</em> (<em>echo reply</em>). 
 <p>
<![ %OBS [
 <p>
<strong>OBS1:</strong> 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. ]]>


<sect1 id="fw-iptables-path-FtpTCPLocalNet-Local">Conexão FTP de 192.168.1.4 para 192.168.1.1
 <p>
<list compact>
 <item>Endereço de Origem: <tt>192.168.1.4</tt>
 <item>Endereço de Destino: <tt>192.168.1.1</tt>
 <item>Interface de Origem: <tt>eth0</tt>
 <item>Interface de Destino: <tt>eth0</tt>
 <item>Porta Origem: <tt>1030</tt>
 <item>Porta Destino: <tt>21</tt>
 <item>Protocolo: <tt>TCP</tt>
 <item>Descrição: <tt>Conexão ftp (até o prompt de login, sem transferência de dados).</tt>
</list>
<example>
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|
+-------------+    +-------------+    +------------------+

</example>
A requisição ftp passa através dos chains especificados em <em>ENTRADA DOS 
PACOTES</em> com o destino <file>192.168.1.1</file> porta <file>21</file> e 
retorna por <em>SAÍDA DE PACOTES</em> para <file>192.168.1.4</file> porta 
<file>1030</file>. Após a conexão ser estabelecida, o caminho de entrada de 
pacotes é: 
<example>
+-----------------+    +------------+    +------------+
|PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter|
+-----------------+    +------------+    +------------+

</example>
pois os dados não precisam de tratamento DNAT (o chain <em>PREROUTING-nat</em> 
é processado somente uma vez a procura de regras que conferem, principalmente 
para fazer DNAT). 
<![ %OBS [
 <p>
<strong>OBS:</strong> O roteamento é sempre realizado após o processamento do 
chain <em>PREROUTING</em> da tabela <em>nat</em>. ]]>


<sect1 id="fw-iptables-path-FtpTCPLocalNet-RemoteNet">Conexão FTP de 192.168.1.4 para ftp.debian.org.br
 <p>
<list compact>
 <item>Endereço de Origem: <tt>192.168.1.4</tt>
 <item>Endereço de Destino: <tt>200.198.129.162</tt>
 <item>Interface de Origem: <tt>eth0</tt>
 <item>Interface de Destino: <tt>ppp0</tt>
 <item>Porta Origem: <tt>1032</tt>
 <item>Porta Destino: <tt>21</tt>
 <item>Protocolo: <tt>TCP</tt>
 <item>Descrição: <tt>Conexão ftp (até o prompt de login, sem transferência de dados).</tt>
</list>
<example>
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|
+-----------------+    +--------------+    +--------------+    +------------------+

</example>
A requisição ftp passa através dos chains especificados em <em>SAÍDA DOS 
PACOTES</em> com o destino <file>200.198.129.162</file> porta 
<file>21</file> (após a resolução DNS de <file>ftp.debian.org.br</file>) e 
retorna por <em>ENTRADA DE PACOTES</em> para <file>192.168.1.4</file> porta 
<file>1032</file>. 
 <p>
Note que o Masquerading regrava os pacotes; para a máquina 
<file>200.198.129.162</file> a conexão está sendo feita para 
<file>200.217.29.67</file>. As respostas de conexões vindas de 
<file>200.198.129.162</file> e indo para <file>200.217.29.67</file> 
são regravadas no firewall com o destino <file>192.168.1.4</file> 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 é: 
<example>
+-----------------+    +--------------+    +--------------+    +------------------+
|PREROUTING-mangle| => |FORWARD-mangle| => |FORWARD-filter| => |POSTROUTING-mangle|
+-----------------+    +--------------+    +--------------+    +------------------+

</example>
Após a conexão estabelecida, o caminho da entrada de pacotes vindos de 200.198.129.163 é:
<example>
+-----------------+    +--------------+    +--------------+    +------------------+
|PREROUTING-mangle| => |FORWARD-mangle| => |FORWARD-filter| => |POSTROUTING-mangle|
+-----------------+    +--------------+    +--------------+    +------------------+

</example>
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 
<file>www.debian.org.br</file> para <file>192.168.1.4</file>. 
 <p>
<![ %OBS [
 <p>
<strong>OBS:</strong> As conexões Masquerading feitas através da rede 
interna, são enviadas para <file>200.198.129.162</file> tem o endereço de origem
ajustado para <file>200.217.29.67</file> que é o IP de nossa interface 
<file>ppp0</file>. 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 
<file>192.168.1.4</file>. Caso uma operação de Masquerading falhe, os 
pacotes serão Bloqueados. ]]>




<sect1 id="fw-iptables-path-FtpTCPRemoteNet-Local">Conexão FTP de 200.198.129.162 para 200.217.29.167
 <p>
<list compact>
 <item>Endereço de Origem: <tt>200.198.129.162</tt>
 <item>Endereço de Destino: <tt>200.217.29.67</tt>
 <item>Interface de Origem: <tt>ppp0</tt>
 <item>Interface de Destino: <tt>ppp0</tt>
 <item>Porta Origem: <tt>3716</tt>
 <item>Porta Destino: <tt>21</tt>
 <item>Protocolo: <tt>TCP</tt>
 <item>Descrição: <tt>Conexão ao serviço ftp do firewall</tt>
</list>
<example>
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|
+-------------+    +-------------+    +------------------+

</example>
A requisição ftp passa através dos chains especificados em <em>ENTRADA DOS 
PACOTES</em> com o destino <file>200.217.29.67</file> (nossa interface 
<file>ppp0</file> local) porta <file>21</file> e retorna por 
<em>SAÍDA DE PACOTES</em> para <file>200.198.129.162</file> porta 
<file>3716</file> (também via <file>ppp0</file>). Após a conexão ser 
estabelecida, o caminho de entrada de pacotes é: 
<example>
+-----------------+    +------------+    +------------+
|PREROUTING-mangle| => |INPUT-mangle| => |INPUT-filter|
+-----------------+    +------------+    +------------+

</example>
Isto acontece porque após feita a análise do chain <em>PREROUTING</em> (para 
necessidade de DNAT), a máquina já saberá tomar a decisão apropriada 
para gerenciar aquela conexão. 


<![ %CONSTRUCAO [ 
************** Documentar conexões da máquina 200.242.30.253 para máquina da rede 192.168.1.0: (passa pelo FORWARDING, usando redirecionamento de portas). ]]>


<sect1 id="fw-iptables-path-grafico">Gráfico geral da passagem dos pacotes
 <p>
Este gráfico foi retirado do documento 
<file>netfilter-hacking-HOWTO.txt</file> 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 <prgn>iptables</prgn>.
<example>
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              |
                    +----------------------------------------+

</example>


