Pruebas de NAT entre IPv6 e IPv4

Fecha: 16 de marzo del 2022

 

Escenario

 

Estas pruebas simulan la conexión de un servidor con IPv4 (que por motivos X no se podría migrar) a internet

con IPv6 (tal como sería internet dentro de unos años).

Para esto utilizaremos dos mecanismos de NAT ya deprecados pero vigentes, que traducen direcciones IPv6

en IPv4 y viceversa, con un toque de PAT para poder enmascarar N hosts IPv6 (bueno, unos ~65000) en una

única dirección IPv4 que es la que verá el server como origen.

 

 

Hay otras maneras de hacer convivir ambas versiones pero esta me motiva a practicar el “arte de natear”.

 

Este lab se realizó con equipos reales y aprovechando una conexión FTTH que me provee IPv6.

 

1.- Verificamos interface a internet en IPv6:

 

interface Vlan1

 description Outside

 no ip address

 ipv6 address autoconfig default (se autoconfigura con eui-64 y mete default route en la tabla)

 ipv6 enable

 end

 

2.- Verificamos interface en IPv4:

 

interface Vlan2

 description Inside

 ip address 192.168.0.1 255.255.255.0

 end

 

3.- Verificamos de ruta por defecto:

 

Borde-64#sh ipv6 route

IPv6 Routing Table - default - 5 entries

Codes: C - Connected, L - Local, S - Static, U - Per-user Static route

       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP

       H - NHRP, D - EIGRP, EX - EIGRP external, ND - ND Default

       NDp - ND Prefix, DCE - Destination, NDr - Redirect, O - OSPF Intra

       OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1

       ON2 - OSPF NSSA ext 2, ls - LISP site, ld - LISP dyn-EID, a - Application

ND  ::/0 [2/0]

     via FE80::1, Vlan1

NDp 2803:9800:98C3:95::/64 [2/0]

     via Vlan1, directly connected

LC  2803:9800:98C3:95::2/128 [0/0]

     via Vlan1, receive

L   2803:9800:98C3:95:8AF0:31FF:FE7E:4D00/128 [0/0] (autoconfigurada con eui-64)

     via Vlan1, receive

L   FF00::/8 [0/0]

     via Null0, receive

Borde-64#

 

4.- Verificamos de conectividad al default gateway:

 

Borde-64#ping ipv6 FE80::1

Output Interface: vlan 1

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to FE80::1, timeout is 2 seconds:

Packet sent with a source address of FE80::8AF0:31FF:FE7E:4D00%Vlan1

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/4 ms

Borde-64#

 

Borde-64#sh ipv6 neighbors (similar a show arp en IPv4)

IPv6 Address                              Age Link-layer Addr   State    Interface

2803:9800:98C3:95::1                 0  30df.8d2c.ea50  REACH  Vl1

FE80::1                                             0  30df.8d2c.ea50  REACH  Vl1

 

Borde-64#

 

5.- Verificamos de conectividad a internet:

 

C:\>nslookup www.cisco.com (ejecutado en IPv4)

Servidor:  dns.google

Address:  8.8.8.8

 

Respuesta no autoritativa:

Nombre:  e2867.dsca.akamaiedge.net

Addresses:  2a02:26f0:b100:198::b33

                        2a02:26f0:b100:187::b33

                        23.192.128.215

Aliases:  www.cisco.com

                 www.cisco.com.akadns.net

                 wwwds.cisco.com.edgekey.net

                 wwwds.cisco.com.edgekey.net.globalredir.akadns.net

 

Borde-64#ping ipv6 2a02:26f0:b100:198::b33

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 2A02:26F0:B100:198::B33, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 188/188/188 ms

Borde-64#

 

6.- Verificamos en la PC cliente:

 

Adaptador de LAN inalámbrica Wi-Fi:

 

   Sufijo DNS específico para la conexión. . :

   Descripción . . . . . . . . . . . . . . . : Intel(R) Dual Band Wireless-AC 8265

   Dirección física. . . . . . . . . . . . . : A4-C3-F0-3B-56-2D

   DHCP habilitado . . . . . . . . . . . . . : sí

   Configuración automática habilitada . . . : sí

   Dirección IPv6 . . . . . . . . . . . . . . . . . . . : 2803:9800:98C3:95:6007:82DF:2482:3F8C(Preferido)

   Dirección IPv6 temporal. . . . . . . . . . . : 2803:9800:98c3:95:14b2:9584:1621:b725(Preferido)

   Vínculo: dirección IPv6 local. . . . . . . . : fe80::701e:a078:2164:7008%15(Preferido)

   Dirección IPv4. . . . . . . . . . . . . . . . . . . : 192.168.1.65(Preferido)

   Máscara de subred . . . . . . . . . . . . . .  : 255.255.255.0

   Concesión obtenida. . . . . . . . . . . . . . : martes, 15 de marzo de 2022 23:27:35

   La concesión expira . . . . . . . . . . . . . . : miércoles, 16 de marzo de 2022 16:39:49

   Puerta de enlace predeterminada . . : fe80::8af0:31ff:fe7e:4d00%15

                                                                                fe80::1%15

   IAID DHCPv6 . . . . . . . . . . . . . . . . . . . .: 195347440

   DUID de cliente DHCPv6. . . . . . . . . . : 00-01-00-01-28-64-D5-05-A4-C3-F0-3B-56-2D

   Servidores DNS. . . . . . .. . . . . . . . . . . : fe80::1%15

                                                                             fe80::1%15

   NetBIOS sobre TCP/IP. . . . . . . . . . . . : deshabilitado

 

C:\>

 

7.- Activamos NAT en las interfaces:

 

Borde-64(config)#int vlan 1

Borde-64(config-if)#ipv6 nat

Borde-64(config-if)#exit

Borde-64(config)#

 

Borde-64(config)#int vlan 2

Borde-64(config-if)#ipv6 nat (aunque la interface no tenga configurada una dirección IPv6)

Borde-64(config-if)#exit

Borde-64(config)#

 

8.- Definimos que destinos son candidatos a natearse:

 

Todo lo que llegue a la interface outside y coincida con este refijo será candidata a evaluarse y natearse.

El /96 se debe a que a 128 bits se le restan 32 bits para potenciales direcciones IPv4.

 

Borde-64(config)#ipv6 nat prefix 2803:9800:98C3:95::/96

Borde-64(config)#

 

9.- Definimos que direcciones específicas son candidatas a natearse:

 

El origen es any ya que úede ser cualquier host (con IPv6) en internet.

 

Borde-64(config)#ipv6 access-list SOURCE

Borde-64(config-acl))#permit ipv6 any host 2803:9800:98C3:95::C0A8:A

Borde-64(config-acl))#exit

Borde-64(config)#

 

10.- Definimos la dirección (o direcciones) IPv4 luego del NAT:

 

En este caso es un pool con una única dirección ero podría ser un rango.

 

Borde-64(config)#ipv6 nat v6v4 pool IPv4 192.168.0.2 192.168.0.2 prefix-length 24

Borde-64(config)#

 

11.- Definimos la política de NAT:

 

Esto se lee: la IPv6 origen que coincida con la ACL se traduce en la IPv4 del pool y se le realiza un PAT para

poder multiplexar N direcciones (IPv6 traducidas) en una única IPv4 y el server nos “vea” como una IPv4

en lugar de N direcciones IPv6.          

                                                                  (definido en 9.)    (definido en 10.)

                                                                                |                       |

Borde-64(config)#ipv6 nat v6v4 source list SOURCE pool IPv4 overload

Borde-64(config)#

 

Este mecanismo limita a que las sesiones sean solo entrantes, por lo tanto el server sólo puede escuchar

peticiones de conexión.

Para salir a internet pegandole a direcciones IPv4 y natearse a IPv6 solo se podría salir a una limitada parte

por cuestiones matemáticas (2^32 en lugar de 2^128) o utilizar un proxy con patas en ambos stacks IP.

 

12.- Configuración del NAT v4v6:

 

Esto se utiliza para traducir/convertir el tráfico de retorno y se lee como el prefijo + C0A8:A , que es lo mismo

que C0A8:000A, que es la versión hexadecimal de 192 (C0) 168 (A8) 0 (00) 10 (0A), ahí venía el /96 + /32 = /128.

 

Borde-64(config)#ipv6 nat v4v6 source 192.168.0.10 2803:9800:98C3:95::C0A8:A

Borde-64(config)#

 

13.- Truco para hacer “arrancar” la conectividad en IPv6:

 

Este es un detalle extra: al no funcionar el escenario y no tener gestión del router del ISP para forzar un ARP (versión 6),

generamos tráfico con la IP destino del NAT y luego la eliminamos para que funcione el NAT propiamente dicho, ya que

el router del ISP ahora aprendió cómo alcanzar dicha IP mediante la MAC.

 

Borde-64#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

Borde-64(config)#int vlan 1

Borde-64(config-if)#ipv6 address 2803:9800:98C3:95::C0A8:A/128

Borde-64(config-if)#

 

14.- Verificamos conectividad desde internet:

 

C:\>ping 2803:9800:98C3:95::C0A8:A

 

Haciendo ping a 2803:9800:98c3:95::c0a8:a con 32 bytes de datos:

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=6ms

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=9ms

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=9ms

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=5ms

 

15.- Desactivamos el “truco” del ARP:

 

Borde-64(config)#int vlan 1

Borde-64(config-if)#no ipv6 address 2803:9800:98C3:95::C0A8:A/128

Borde-64(config-if)#

 

Ahora responde el server vía NAT, la MAC sigue siendo la misma de la interface del router

ya que el NAT actúa como una suerte de proxy-arp.

 

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=6ms

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=4ms

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=5ms

Respuesta desde 2803:9800:98c3:95::c0a8:a: tiempo=6ms

 

16.- Nos conectamos al server:

 

               

 

17.- Verificamos NAT:

 

Borde-64#sh ipv6 nat translations

Prot  IPv4 source              IPv6 source

      IPv4 destination         IPv6 destination

     ------ ----------------  ----------------------

      192.168.0.10             2803:9800:98C3:95::C0A8:A

 

icmp  192.168.0.2,1              2803:9800:98C3:95:6007:82DF:2482:3F8C,1 (los pings del item  15.)

           192.168.0.10,1           2803:9800:98C3:95::C0A8:A,1         

 

tcp   192.168.0.2,13699        2803:9800:98C3:95:6007:82DF:2482:3F8C,13699  (sesión RDP del item  16.)

         192.168.0.10,3389        2803:9800:98C3:95::C0A8:A,3389

 

Borde-64#

 

Borde-64#sh access-lists (asociada al NAT v6v4)

IPv6 access list SOURCE

    permit ipv6 any host 2803:9800:98C3:95::C0A8:A (14 matches) sequence 10

Borde-64#

 

18.- Verificamos con netstat en el server:

 

 

19.- Comparación en Wireshark:

 

Puede verse que la sesión TCP es la misma, mismos puertos en ambos lados pero se desvirtuaría en caso de hacer

intensivo el PAT ya que varios puertos de origen podrían coincidir, pero se comparan ambas sesiones IP (no es el

término correcto porque IP no maneja sesiones). Detalle: esta es otra sesión RDP diferente al punto 18.

 

 

20.- Configuración afectada:

 

Borde-64#sh runn (sólo lo relevante)

Building configuration...

 

Current configuration : 2529 bytes

!

! Last configuration change at 22:15:33 UTC Wed Mar 16 2022 by ernesto

version 15.3

!

hostname Borde-64

!

ipv6 unicast-routing

!

interface FastEthernet0

 description Outside

!

interface FastEthernet1

 description Inside

 switchport access vlan 2

!

interface Vlan1

 description Outside

 no ip address

 ipv6 address autoconfig default

 ipv6 enable

 ipv6 nat

!

interface Vlan2

 description Inside

 ip address 192.168.0.1 255.255.255.0

 ipv6 enable

 ipv6 nat

!

ipv6 nat v4v6 source 192.168.0.10 2803:9800:98C3:95::C0A8:A

ipv6 nat v6v4 source list SOURCE pool IPv4 overload

ipv6 nat v6v4 pool IPv4 192.168.0.2 192.168.0.2 prefix-length 24

ipv6 nat prefix 2803:9800:98C3:95::/96

!

ipv6 access-list SOURCE

 permit ipv6 any host 2803:9800:98C3:95::C0A8:A

!

end

 

Borde-64#

 

Este lab se lo dedico a Manu Garcia Vazquez, quien me “canonizó” durante la pandemia

al trabajar juntos en unos NATs roñosos.

 

 

(2022) Networking for rare people

Rosario, Argentina