Admin Libre - Administración de sistemas y redes

Conectividad IPv6 desde IPv4 con un VPS y NAT66
Por Francisco Gaitán el 4 de Abril de 2022

Si tu proveedor de servicios de internet sólo te ofrece IPv4 esto no significa que no puedas navegar con IPv6. Gracias a un VPN WireGuard instalado en un VPS con IPv6 y NAT66 es posible tener conectividad IPv6 aún si el proveedor del VPS sólo nos da un rango de IPs /64.

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)

Salvo que tu proveedor del VPS ofrezca un rango mayor que /64 (tal como /48, /58 ó /60) 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.3/32 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 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: 1 -> 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

Misión

Admin Libre promueve el uso de software libre y de calidad tanto en los servidores como en el hardware de red con el objetivo de hacer los sistemas más seguros y auditables.