segunda-feira, 16 de março de 2009

NAT com 1 única interface física

Gostaria de apresentar uma solução chamada Nat on a Stick (Nat no palito), antes de falar sobre um "projeto" real que me foi pedido uma vez.

O entendimento dessa técnica exige o conhecimento básico de NAT (Network Address Translation) ou tradução de endereços de rede, e PBR (Policy Based Routing) que consiste no roteamento de pacotes baseado em fatores diferentes do endereço (camada 3, IP) de destino.

NAT
How NAT Works* [IP Addressing Services] - Cisco Systems

PBR
Understanding Policy Routing - Cisco Systems

NAT é feito utilizando pelo menos duas interfaces:
uma interface de entrada (nat inside) e uma interface de saída (nat outside).

Um NAT (ipv4) básico consiste em se traduzir o endereço IP de origem de um pacote por um outro endereço IP. (Existem muitas variações de NAT: policy nat, outside nat, nat estático, etc)

Agora imaginem a situação (ver a figura abaixo) onde temos um roteador (R1) com apenas 1 interface física (e0/0) e ainda assim precisamos realizar um NAT para que os clientes da LAN 192.168.2.0 possam acessar a Internet pelo provedor (roteador R2). Vamos dizer que isso ocorreu porque o roteador do provedor não estava configurado para realizar NAT para o cliente. Podemos resolver esse problema utilizando a técnica de Nat on a stick.




O Pc 192.168.2.10/24 tem como gateway o roteador R1 192.168.2.1, que apenas possuí uma interface física (e0/0).

O objetivo, aqui, é traduzir o endereço de origem 192.168.2.1 por um outro endereço (no caso 200.10.10.10) quando o PC acessar algum endereço externo (no caso 66.66.66.66).

Como o roteador tem apenas 1 interface, precisamos, dar um jeito de criar outra interface que será usada como saída (nat outside), e para isso usamos uma interface virtual:
interface loopback.

As configurações do NAT (overload = PAT) não mudam em relação a um NAT básico.

interface Loopback0
ip add 192.168.4.1 255.255.255.255
ip nat outside
interface Ethernet0/0
ip ad 192.168.2.1 255.255.255.0
ip nat inside
ip nat pool nat_pool 200.10.10.10 200.10.10.10 netmask 255.255.255.0
ip nat inside source list 1 pool nat_pool overload
!
access-list 1 permit 192.168.2.0 0.0.0.255

E, para podermos fazer com que o tráfego vindo do PC passe por ambas interfaces (et0/0 e lo0) utilizamos o PBR. Neste caso, vamos selecionar todo trafego vindo da subnet 192.168.2.0/24 e vamos redirecionar para o endereço da interface loop0 (192.168.4.1).

route-map rm_pbr permit 10
match ip address 1
set ip next-hop 192.168.4.1
interface Ethernet0/0
ip address 192.168.2.1 255.255.255.0
ip nat inside
ip policy route-map rm_pbr

O efeito desejado pode ser visto na figura abaixo, onde vemos que o roteador R2 (66.66.66.66/32) responde ao ping (ICMP) do PC (192.168.2.10) mas envia o pacote para o endereço "nateado" de destino 200.10.10.10.

Esta imagem foi redimensionada. Clique na barra para ver a imagem em tamanho real. O tamanho da imagem original é 688x344.


Técnicas como essa, utilizando uma interface loopback e PBR, são vistas em algumas outras situações, como por exemplo no uso de ACL reflexivas, onde desejamos fazer com que os pacotes gerados no próprio roteador sejam "sujeitos" processados por essas access-lists. Mas, isso fica pra um outro post.

Artigo original em: http://under-linux.org/b571-nat-com-1-unica-interface-fisica-nat-stick