adminlibre - Administración de sistemas y redes

Conectividad IPv6 desde IPv4 con un VPS y NAT66
Por admin el 4 de Abril de 2022

Si tu proveedor de servicios de internet sólo te ofrece IPv4, para conseguir conectividad IPv6 necesitas un servidor VPS. Por desgracia aún no es fácil encontrar proveedores que ofrezcan un rango IPv6 mayor que /64 (como /48, /58 ó /60) para crear dos subredes /64, aunque aún sin ser la solución ideal eso no impide conseguir conectividad IPv6 usando una dirección única local y NAT66.

Para realizar esta configuración parto de la configuración de la entrada VPN WireGuard con OpenBSD. Partiendo de este VPN con OpenBSD 7.1 y un cliente OpenBSD 7.0 explicaré los cambios para tener conectividad IPv6 desde una conexión IPv4.

Obteniendo una dirección única local (ULA)

Necesitarás usar una dirección única local (RFC 4193) y NAT66 para tener dos subredes /64, una para cada lado del VPN.

Para ello usaré este generador de direcciones únicas locales a partir de la MAC de un equipo de mi propiedad, obteniendo estos datos:

  • Red fdae:0d06:c54d::/48
  • Subredes /64 desde fdae:0d06:c54d:0::/64 hasta fdae:0d06:c54d:ffff::/64

Usaré estas subredes:

  • Servidor remoto: fdb9:a1d2:585c:0::1/64
  • Máquina local: fdb9:a1d2:585c:0::100/64

Configuración de IPv6 en WireGuard

/etc/hostname.wg0 del servidor:

wgkey `cat /etc/wireguard/$(hostname).key` wgport 51820
wgpeer <clave-publica-cliente> wgaip fdb9:a1d2:585c:0::100/64 wgaip 10.0.0.0/8 wgpsk <clave-psk-compartida> 
inet 10.0.0.1/8 
inet6 fdb9:a1d2:585c:0::1/64
up

/etc/hostname.wg0 del cliente:

wgkey `cat /etc/wireguard/$(hostname).key`
wgpeer <clave-publica-servidor> wgendpoint 203.0.113.1 51820 wgaip ::/0 wgaip 0.0.0.0/0 wgpka 25 wgpsk <clave-psk-compartida> 
inet 10.0.0.3/8
inet6 fdb9:a1d2:585c:0::100/64
wgrtable 1
up
!route add -net default 10.0.0.1
!route add -inet6 default fdb9:a1d2:585c::1

Nada más con esto y una vez reiniciadas las interfaces wg0 en cada extremo ya se debería poder hacer ping6 entre cliente y servidor.

Configuración de IPv6 en el servidor

Esto depende de cada proveedor. Normalmente basta con añadir esto a /etc/hostname.vio0:

inet6 autoconf -soii -temporary

Lo que sí es común a todos es permitir los tipos recomendados de ICMP6 tal y como explica el RFC 4890:

# RFC 4890
pass inet6 proto icmp6 all icmp6-type { 1 2 3 4 128 129 133 134 135 136 137 }

Configuración del reenvío de IPv6

vpn$ doas sysctl net.inet6.ip6.forwarding=1 
net.inet6.ip6.forwarding: 0 -> 1
vpn$ cat /etc/sysctl.conf                                                      
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

A partir de aquí, una vez cargadas las nuevas reglas del firewall y levantando de nuevo las interfaces wg0 ya debe de haber conectividad IPv6, la cual se puede probar usando la herramienta ping6 sobre un host que soporte IPv6.

Configuración de NAT66

Copio aquí la línea clave de Packet Filter tanto para NAT como para NAT66, que va debajo de la directiva set skip:

pass out quick on egress from wg0:network to any nat-to (egress)

Configuración de DNS en el cliente

Para tener conectividad completa necesitas añadir los DNS IPv6 al archivo /etc/resolv.conf o como corresponda en tu sistema.

Prueba de conexión

Para comprobar que tienes conectividad IPv6 completa ve al sitio IPv6 Test.

Conectividad IPv6 sin NAT66

Echa un ojo al artículo WireGuard IPv6 VPN with OpenBSD.amsterdam.

Destacado