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