<sect id="fw-iptables-nat">A tabela nat (Network Address Translation) - fazendo nat
 <p>
A tabela <em>nat</em> serve para controlar a tradução dos endereços que 
atravessam o código de roteamento da máquina <prgn>Linux</prgn>. Existem 
3 chains na tabela <em>nat</em>: <em>PREROUTING</em>, <em>OUTPUT</em> e 
<em>POSTROUTING</em> (veja <ref id="fw-iptables-tabelas"> para maiores detalhes).
 <p>
A tradução de endereços tem inúmeras utilidades, uma delas é o Masquerading, 
onde máquinas de uma rede interna podem acessar a Internet através de uma 
máquina <prgn>Linux</prgn>, redirecionamento de porta, proxy 
transparente, etc. Esta seção abordará os tipos de NAT, exemplos de 
como criar rapidamente uma conexão IP masquerading e entender como a 
tradução de endereços funciona no <prgn>iptables</prgn>.
 <p>
Se sua intenção é ligar sua rede a Internet existem duas opções: 
<list compact>
 <item>
Você possui uma conexão que lhe oferece um endereço IP dinâmico (a cada 
conexão é dado um endereço IP - como uma conexão PPP) então o IP masquerading é o 
que precisa (veja <ref id="fw-iptables-nat-fastmasquerade"> ou 
<ref id="fw-iptables-nat-snat-masquerade">).
 <item>
Você tem uma conexão que lhe oferece um endereço IP permanente (ADSL, por exemplo) 
então o SNAT é o que precisa (veja <ref id="fw-iptables-nat-snat">).
</list>


<sect1 id="fw-iptables-nat-N">Criando um novo chain na tabela NAT
 <p>
O procedimento para criação de um novo chain nesta tabela é o mesmo
descrito em <ref id="fw-iptables-chains-N"> será necessário somente
especificar a tabela nat (-t nat) para que o novo chain não seja 
criado na tabela padrão (-t filter).
<example>
iptables -t nat -N intra-inter

</example>
Que criará o chain chamado <em>intra-inter</em> na tabela <em>nat</em>. Para 
inserir regras neste chain será necessário especificar a opção "-t nat".


<sect1 id="fw-iptables-nat-fastmasquerade">Fazendo IP masquerading (para os apressados)
 <p>
Você precisará de um kernel com suporte ao <prgn>iptables</prgn> (veja 
<ref id="fw-iptables-supkernel"> e <prgn>ip_forward</prgn> e então digitar 
os dois comandos abaixo para habilitar o masquerading para todas as 
máquinas da rede 192.168.1.*: 
<example>
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
echo "1" >/proc/sys/net/ipv4/ip_forward

</example>
A configuração do servidor <prgn>Linux</prgn> está completa, agora os 
clientes da rede precisarão ser configurados para usar o endereço IP 
do servidor <prgn>Linux</prgn> como gateway. É recomendável instalar 
um servidor proxy e DNS na máquina <prgn>Linux</prgn> para acelerar o 
desempenho das requisições/resolução de nomes das máquinas em rede. A 
utilização de bits TOS também pode trazer um grande aumento 
de velocidade para os diferentes serviços da rede (veja <ref id="fw-iptables-mangle-TOS">).


<sect1 id="fw-iptables-nat-snat">Fazendo SNAT
 <p>
SNAT (source nat - nat no endereço de origem) consiste em modificar o endereço
de origem das máquinas clientes antes dos pacotes serem enviados. A máquina 
roteadora é inteligente o bastante para lembrar dos pacotes modificados e 
reescrever os endereços assim que obter a resposta da máquina de destino, 
direcionando os pacotes ao destino correto. Toda operação de SNAT é feita 
no chain <em>POSTROUTING</em>. 
 <p>
É permitido especificar endereços de origem/destino, protocolos, portas 
de origem/destino, interface de entrada/saída (dependendo do chain), 
alvos, etc. É desnecessário especificar fragmentos na tabela nat, pois
eles serão remontados antes de entrar no código de roteamento. 
 <p>
O SNAT é a solução quando você tem acesso a internet através de um único 
IP e deseja fazer que sua rede tenha acesso a Internet através da máquina
<prgn>Linux</prgn>. Nenhuma máquina da Internet poderá ter acesso direto 
as máquinas de sua rede interna via SNAT.
<![ %OBS [ 
 <p>
<strong>OBS:</strong> A observação acima não leva em conta o controle de 
acesso externo configurado na máquina que estiver configurando o 
<prgn>iptables</prgn>, uma configuração mau realizada pode expor sua máquina
a acessos externos indesejados e comprometer sua rede interna caso alguém 
consiga acesso direto ao servidor. ]]>
 <p>
É necessário especificar SNAT como alvo (-j SNAT) quando desejar que as máquinas 
de sua rede interna tenha acesso a Internet através do IP fixo da máquina <prgn>Linux</prgn> (para conexões intermitentes como PPP, veja 
<ref id="fw-iptables-nat-snat-masquerade">). 
O parâmetro <tt>--to IP:portas</tt> deve ser usado após o alvo SNAT. Ele serve 
para especificar um endereço IP, faixa de endereços e opcionalmente uma 
porta ou faixa de portas que será substituída. 

Toda a operação de SNAT é realizada através do chain POSTROUTING:
<example>
# Modifica o endereço IP dos pacotes vindos da máquina 192.168.1.2 da rede interna 
# que tem como destino a interface eth1 para 200.200.217.40 (que é o nosso endereço 
# IP da interface ligada a Internet). 
iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth1 -j SNAT --to 200.200.217.40

</example>
Os pacotes indo para a Internet (nossa conexão é feita via eth1, nossa interface 
externa) vindo do endereço 192.168.1.2, são substituídos por 200.241.200.40 e 
enviados para fora. Quando a resposta a requisição é retornada, a máquina com 
<prgn>iptables</prgn> recebe os pacotes e faz a operação inversa, modificando o 
endereço 200.241.200.40 novamente para 192.168.1.2 e enviando a resposta a 
máquina de nossa rede interna. Após definir suas regras de NAT, execute o 
comando <tt>echo "1" >/proc/sys/net/ipv4/ip_forward</tt> para habilitar o 
suporte a redirecionamento de pacotes no kernel. 
 <p>
Também é possível especificar faixas de endereços e portas que serão 
substituídas: 
<example>
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50

</example>
Modifica o endereço IP de origem de todas as máquinas da rede 192.168.1.0/24 que 
tem o destino a interface eth0 para 200.241.200.40 a 200.241.200.50. O 
endereço IP selecionado é escolhido de acordo com o último IP 
alocado. 
<example>
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50:1-1023
</example>
Idêntico ao anterior, mas faz somente substituições na faixa de portas 
de origem de 1 a 1023.

<example>
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50 --to 200.200.217.70-200.200.217.73

</example>
Faz o mapeamento para a faixa de portas 200.200.217.40 a 200.200.217.50 e de 
200.200.217.70 a 200.200.217.73. 

<![ %OBS [
 <p>
<strong>OBS1:</strong> Se por algum motivo não for possível mapear uma 
conexão NAT, ela será derrubada. 
 <p>
<strong>OBS2:</strong> Tenha certeza que as respostas podem chegar até 
a máquina que fez o NAT. Se estiver fazendo SNAT em um endereço livre em 
sua rede (como 200.200.217.73). 
 <p>
<strong>OBS3:</strong> Como notou acima, o SNAT é usado quando temos uma 
conexão externa com um ou mais IP's fixos. O Masquerading é uma forma 
especial de SNAT usada para funcionar em conexões que recebem endereços 
IP aleatórios (PPP). 
 <p>
<strong>OBS4:</strong> Não se esqueça de habilitar o redirecionamento de 
pacotes após fazer suas regra de NAT com o comando: 
<tt>echo "1" >/proc/sys/net/ipv4/ip_forward</tt>, caso contrário o redirecionamento
de pacotes não funcionará. ]]>



<sect2 id="fw-iptables-nat-snat-masquerade">Fazendo IP Masquerading  
 <p>
O IP Masquerading é um tipo especial de SNAT usado para conectar a sua rede 
interna a internet quando você recebe um IP dinâmico de seu provedor (como em 
conexões ppp). Todas as operações de IP Masquerading são realizadas no chain 
<em>POSTROUTING</em>. Se você tem um IP fixo, deve ler 
<ref id="fw-iptables-nat-snat">.
 <p>
Para fazer IP Masquerading de uma máquina com o IP 192.168.1.2 para ter acesso 
a Internet, use o comando: 
<example>
iptables -t nat -A POSTROUTING -s 192.168.1.2/32 -o ppp0 -j MASQUERADE

</example>
A diferença é que o alvo é <em>-j MASQUERADE</em>. O comando acima faz
IP Masquerading de todo o tráfego de 192.168.1.2 indo para a interface 
ppp0: O endereço IP dos pacotes vindos de  192.168.1.2 são substituídos pelo 
IP oferecido pelo seu provedor de acesso no momento da conexão, quando a 
resposta é retornada a operação inversa é realizada para garantir que a 
resposta chegue ao destino. Nenhuma máquina da internet poderá ter acesso
direto a sua máquina conectava via Masquerading. 
 <p>
Para fazer o IP Masquerading de todas as máquinas da rede 192.168.1.*:
<example>
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

</example>
Após definir a regra para fazer Masquerading (SNAT), execute o 
comando <tt>echo "1" >/proc/sys/net/ipv4/ip_forward</tt> para habilitar o 
suporte a redirecionamento de pacotes no kernel. 


<sect1 id="fw-iptables-nat-dnat">Fazendo DNAT
 <p>
DNAT (Destination nat - nat no endereço de destino) consiste em modificar o endereço
de destino das máquinas clientes. O destination nat é muito usado para fazer 
redirecionamento de pacotes, proxyes transparentes e balanceamento de carga.
 <p>
Toda operação de DNAT é feita no chain <em>PREROUTING</em>. As demais opções e 
observações do SNAT são também válidas para DNAT (com exceção que somente é 
permitido especificar a interface de origem no chain PREROUTING). 

<example>
# Modifica o endereço IP destino dos pacotes de 200.200.217.40 vindo da interface eth0
# para 192.168.1.2. 
iptables -t nat -A PREROUTING -s 200.200.217.40 -i eth0 -j DNAT --to 192.168.1.2

</example>
Também é possível especificar faixas de endereços e portas que serão 
substituídas no DNAT: 
<example>
iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.0/24 -j DNAT --to 200.200.217.40-200.200.217.50

</example>
Modifica o endereço IP de destino do tráfego vindos da interface 192.168.1.0/24 
para um IP de 200.241.200.40 a 200.241.200.50. Este é um excelente método para 
fazer o balanceamento de carga entre servidores. O endereço IP selecionado é 
escolhido de acordo com o último IP alocado. 

<example>
iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.0/24 -j DNAT --to 200.200.217.40-200.200.217.50:1024:5000
</example>
Idêntico ao anterior, mas faz somente substituições na faixa de portas 
de destino de 1024 a 5000. A operação acima é a mesma realizada pelo 
<prgn>ipmasqadm</prgn> dos kernels da série 2.2. 

<![ %OBS [
 <p>
<strong>OBS1:</strong> Se por algum motivo não for possível mapear uma 
conexão NAT, ela será derrubada. 
 <p>
<strong>OBS2:</strong> Não se esqueça de conferir se o <file>ip_forward</file>
está ajustado para <tt>1</tt>: <tt>echo "1" &gt;/proc/sys/net/ipv4/ip_forward</tt>.
]]>


<sect2 id="fw-iptables-nat-dnat-redir">Redirecionamento de portas
 <p>
O redirecionamento de portas permite a você repassar conexões com destino 
a uma porta para outra porta na mesma máquina. O alvo <em>REDIRECT</em> é 
usado para fazer esta operação, junto com o argumento <em>--to-port</em> 
especificando a porta que será redirecionada. Este é o método DNAT 
específico para se para fazer proxy transparente (para redirecionamento de 
endereços/portas, veja <ref id="fw-iptables-nat-dnat">). Todas 
as operações de redirecionamento de portas é realizada no chain <em>PREROUTING</em>
e <em>OUTPUT</em> da tabela <em>nat</em>.
<example>
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 81

</example>
Redireciona as conexões indo para a porta 80 para a porta 81 (rodando 
<prgn>squid</prgn>) no firewall. 
<![ %OBS [
 <p>
<strong>ATENÇÃO:</strong> O <prgn>squid</prgn> possui suporte a proxy transparente, 
e poderá atender as requisições acima da regra acima. ]]>


<sect1 id="fw-iptables-nat-monitorando">Monitorando conexões feitas na tabela 
nat
 <p>
Use o comando <tt>cat /proc/net/ip_conntrack</tt> para listar todas as conexões 
atuais tratadas pelo módulo nat. 


