Internet tal como lo conocemos existe gracias a un sistema que asigna a cada dispositivo conectado a la red una dirección conocida como número IP. El sistema que hasta ahora maneja estas direcciones se denomina IPv4 y es capaz de ofrecer un total de 4,294,967,296 direcciones únicas, un número derivado de sus 32 bits (232). Pero el crecimiento constante de dispositivos conectados hace que esta cantidad sea insuficiente. Como cada número IP solo puede ser usado por un dispositivo al mismo tiempo, la solución hasta ahora pasaba por otorgar IPs dinámicas. O sea, cuando un usuario se conecta, se le asigna un número. Cuando se desconecta, ese mismo número es adjudicado a otro usuario. Si tenemos en cuenta que cada vez hay nuevos dispositivos conectados como televisores, automóviles o robots, esta cantidad de direcciones no serán suficientes. Presentamos IPv6. Este nuevo protocolo ofrece un número más acorde al futuro de internet, (2128 o 340 sextillones de direcciones). Si representáramos el tamaño de IPv4 como una pelota de golf, IPv6 sería como el sol. IPv6 ya se está implementando, lo que garantizará que tengamos direcciones disponibles para todos los dispositivos que en un futuro lo requieran.
La primera conexión es la más esencial y es hacer ping entre dos máquinas de una red local. Normalmente Linux trae habilitado el protocolo IPv6 por defecto con direcciones locales. En las siguientes imágenes se ve como responde el comando ping lanzado desde Ubuntu Server a una máquina Debian.
Si queremos que la conexión salga a internet, necesitamos pedir a nuestro ISP que nos asigne una IPv6 Global. Una vez tenemos asignada una IPv6 en el router, podemos consultar que dirección tenemos en nuestra tarjeta de red y hacer ping a cualquier servicio que este configurado con este protocolo.
Algo muy importante después de saber que tenemos conexión con el exterior es proteger la comunicación, y eso se hace a través del Router del ISP y Firewall de la máquina. Aunque ese tema daría para otro post.
Ahora veamos cómo configurar un Servidor Ubuntu con IPv6 usando un agente de túneles como Route64. Supongamos que alojamos un servicio web, con IPv4, necesitamos configurar el reenvío de puertos NAT, DNS dinámico y probablemente lidiar con el CG-NAT si su proveedor de internet los utiliza. Con IPv6, simplemente conectan el dispositivo, le asignan una dirección unicass global y podrán acceder a él de inmediato a través de internet de forma segura y directa. Sin reenvío de puertos ni trucos. Usando un agente de túneles como Route64, podemos crear una conexión IPv6 segura y confiable directamente sobre su internet IPv4 existente. En el servidor Ubuntu habilitaremos dos interfaces de red, una para la red pública y otra para la red privada. Comencemos por identificar nuestras interfaces de red...
Asignamos una dirección IPv4 estática a la interfaz ens160. Esa será la interfaz pública. Ubuntu almacena todos los archivos de configuración de red en la carpeta /etc/systemd/network/. Creamos un nuevo archivo de configuración para esta interfaz llamado ens160.network, es importante que termine en ".network". Aunque el nombre del archivo no importa, nombrarlo como la interfaz ayuda a mantener la claridad.
La sección [Match] le indica a systemd-network a qué interfaz se aplica esta configuración. En nuestro caso, compararemos la interfaz por nombre. En la sección [Network], configuraremos la dirección IP estática, la puerta de enlace predeterminada y el servidor DNS "Cloudflare". Para aplicar los cambios, reiniciamos systemd-networkd, y verificamos que se hayan aplicado los cambios.
Todo parece correcto. Finalmente, verifiquemos que la dirección IP se haya asignado a ens160.
Vemos que se ha asignado 192.168.1.122 a ens160. Esto significa que nuestra interfaz pública ahora está configurada correctamente para el acceso a internet. Con nuestra interfaz de resolución de DNS de red pública configurada correctamente, el siguiente paso es garantizar una resolución de nombres eficiente. Una configuración de DNS bien optimizada puede reducir significativamente la latencia de las consultas y mejorar la capacidad de respuesta. Para ello, usaremos systemd-resolved. Empecemos por consultar el estado del resolvctl.
Todo parece correcto. El modo del solucionador es stub y el DNS es Cloudflare. Probaremos la resolución de DNS consultando google.com.
Obtuvimos la respuesta en 21 milisegundos. Si consultamos una vez más, obtenemos el resultado en 1.5 milisegundo. Eso se debe a que el resultado fue almacenado en caché por nuestro systemd-resolved.
Ahora, abordemos la falta de conectividad IPv6. Dado que nuestra red opera únicamente en IPv4, utilizaremos un agente de túnel IPv6 para cerrar la brecha. Un agente de túnel IPv6 es un servicio que proporciona conectividad IPv6 a redes solo IPv4 creando una conexión tunelizada sobre la infraestructura IPv4 existente. Esencialmente, creamos un túnel punto a punto sobre IPv4 y el ISP enruta nuestro tráfico IPv6 a través de él. Con el servicio Route64 crearemos el túnel IPv6 y gestinaremos el BGP (protocolo de enrutamiento) para los usuarios, utilizando su propia plataforma.
Bien, para empezar necesitamos registrarnos en Route64. Iniciamos sesión en la cuenta recién creada.
En el panel de administración de Route64 desplegamos la pestaña Tunnelbroker para configurar un nuevo túnel IPv6 haciendo clic en agregar nuevo.
Aquí hay una lista de PoPs disponibles. PoP significa punto de presencia. Es una ubicación de centro de datos donde Route64 tiene servidores implementados para brindar sus servicios. Para garantizar el mejor rendimiento, necesitamos conectarnos al PoP con la latencia más baja, generalmente la más cercana geográficamente. Elegiré París. Para medir la latencia, haremos ping al PoP usando su dirección IP 45.154.96.16, 30 milisegundos.
Ahora seleccionemos el PoP. Para el tipo de túnel, elegiré WireGuard, ya que es el único protocolo que admite cifrado. Otros protocolos ofrecen encapsulación, pero carecen de cifrado. A continuación, debemos introducir nuestra IP pública IPv4 en el campo de punto final remoto. Finalmente, pulsaremos "Crear".
El túnel se está aprovisionando.
Haré clic en "Mostrar configuración" para ver los detalles. Aquí tenemos una lista de parámetros esenciales para configurar nuestro lado del túnel.
Para configurar el túnel Wireguard, usaremos systemd-networkd. Primero, necesitamos una clave privada Wireguard. Copiaré y navegaré hasta la carpeta de configuración /etc/systemd/network/ y aquí crearé un archivo llamado wg0.key y pegaremos la clave privada. A continuación, crearemos un archivo de configuración wg0.netdev. La extensión netdev se utiliza para definir dispositivos de red virtuales o de túnel.
Llamemos a la interfaz wg0. El tipo de interfaz es wireguard. En la sección [wireguard], configuraremos la clave privada de la interfaz con el archivo de clave wg0 que creamos anteriormente. Luego, configuraremos el puerto de escucha UDP. Para el puerto remoto, necesitamos proporcionar la clave pública. Luego, configuraremos las IP permitidas, definiremos la IP y el puerto del punto final remoto. Finalmente, configuraremos la función de mantenimiento de conexión persistente a 15 segundos. Esto garantizará que el túnel esté activo incluso si no se usa.
Ahora, configuremos la IP del túnel wg0. Para ello, crearé un archivo de red wg0.network. Como recordarás, este archivo de red se utiliza para configurar direcciones IP. Emparejaremos la interfaz por el nombre wg0. Esa es la interfaz Wireguard que acabamos de configurar usando el archivo "net".
En la sección [Network] definiremos la dirección de la interfaz. Con la opción "BindCarrier", vincularé la interfaz virtual wg0 a la interfaz física ens160. La interfaz virtual solo se activará si la interfaz física y su enlace están activos. Por último, configuremos la puerta de enlace predeterminada para IPv6. El destino es cualquier dirección IPv6 y la puerta de enlace es el extremo remoto de nuestro túnel Wireguard. Guardamos la configuración y reiniciamos systemd-networkd.
Ahora verifiquemos nuestra configuración con una prueba de conectividad IPv6. Primero, mostraré las interfaces de red y sus direcciones IP asignadas.
Aquí está nuestra interfaz WireGuard, ahora con una dirección unicast global IPv6 asignada. Estas direcciones se pueden enrutar a través de internet, lo que garantiza la accesibilidad global.
Revisamos la tabla de enrutamiento IPv6 y hacemos ping a google.com para ver si el DNS resuelve correctamente.
Ahí está nuestra puerta de enlace predeterminada apuntando al otro extremo del túnel WireGuard. La conexión funciona. Y podemos ver que el DNS ha resuelto la dirección IPv6 de Google y que nuestra conexión a través de IPv6 funciona correctamente. Nuestro router ahora está conectado a internet mediante IPv6. Como tenemos una dirección uniccast global, nuestro router es directamente accesible desde cualquier parte del mundo. Para probarlo, me trasladaré a un cliente externo, uno con conectividad IPv6 nativa. Primero, comprobaré su dirección IPv6 mediante curl -6 ifconfig.me.
Vemos que la dirección coincide con la devuelta por el servicio ifconfig. A continuación, volvamos a nuestro router, visualicemos su configuración de interfaz, copiemos su dirección IPv6 e intentemos un ping desde el cliente externo. No, no hay reenvío de puertos. Simplemente funciona.
Para visualizar la ruta de red, tracemos la ruta desde el cliente hasta nuestro router. El tráfico se enruta completamente a través de IPv6.
Finalmente, intentemos una conexión SSH a nuestro router. 👍
Para tener claridad sobre este protocolo. IPv6 elimina el NAT, asignando IPs accesibles públicamente a cada dispositivo, y como he dicho al comienzo de la publicación, la configuración del firewall es fundamental tanto a nivel del router como del host para garantizar la seguridad en una red con IPv6.
En el próximo post veremos como crear subredes IPv6👋😉.


















































