domingo, 28 de diciembre de 2025

Protocolo IPv6

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👋😉. 

jueves, 24 de julio de 2025

Nextcloud & Docker



Hola a todos, hoy voy a explicar cómo montar nuestra propia nube en una máquina CentOS10. Para llevar esto a cabo necesitamos instalar las siguientes herramientas: Nextcloud y Docker Compose. Pero primero empecemos por entender que hace cada una. 
  
Nextcloud es un sistema que nos permite tener nuestra propia nube para sincronizar archivos, calendarios, contactos y muchas cosas más. Nos proporciona una interfaz web a través de la cual podemos acceder a todos nuestros contenidos desde cualquier ordenador. También tiene un cliente de escritorio que nos permite sincronizar nuestros archivos y varias aplicaciones móviles para acceder a diferentes servicios de manera más fácil desde el móvil.🔗

Docker es una de las herramientas facilita la creación de entornos de ejecución aislados y portátiles para las aplicaciones, lo que simplifica la implementación y la gestión, especialmente en arquitecturas de microserviciost. Pero claro, la idea de Docker es que únicamente ejecute un único microservicio por contenedor y no varios a la vez. Para solucionar esto se crea Docker Compose que permite trabajar con varios contenedores de forma simultánea haciendo que estos se conecten y relacionen entre sí. De esta forma, si uno de los contenedores fallase, podrías (depende cómo lo configures) permitir que los otros servicios sigan funcionando.

Bueno, teniendo claro que hace cada herramienta lo siguiente instalar Docker y Docker Compose en la máquina CentOS. Comenzamos por añadir el repositorio de Docker con el siguiente comando.
 
 dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
  

 Ahora veamos las versiones de Docker que me agregó este repositorio en el sistema.
  

Con la siguiente instrucción vamos a decirle al sistema que me instale de los paquetes docker-ce la versión más apropiada para mi máquina y la versión más nueva.
 
 sudo dnf install docker-ce --nobest --allowerasing
 
 
Habilitamos a Docker para que se inicie con el sistema.
 

Verificamos que Docker está corriendo y habilitado para iniciarse con el sistema.
 

Agregamos nuestro usuario al grupo de Docker y consultamos la versión de Docker.
 
 
Ahora, para instalar Docker Compose necesitamos descargarlo con el siguiente comando.
 
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 

Luego de su descarga verificamos que se encuentre en la ruta que le especificamos y le damos permiso de ejecución a ese fichero.   
 
Hasta aquí tenemos las herramientas Docker y Docker Compose instaladas. Ahora necesitamos ir a Docker Hub para ver las especificaciones que necesita el contenedor de Nextcloud para su instalación. 
 
Si echamos un vistazo en la página, encontraremos al final de ésta, el contenido que necesitamos para crear nuestro fichero .yml, indispensable para que Docker Compose se pueda ejecutar. 
 

Creamos el fichero docker-compose.yml en el directorio donde vamos a ejecutar Nextcloud. Copiamos todo el código en el fichero creado y luego pasamos a modificar lo que necesitemos.
 
services: 
  db:
    image: mariadb:10.6       
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_PASSWORD=1234
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=q3it


  app:
    image: nextcloud
    restart: always
    ports:
      - "8080:80"
    links:
      - db
    volumes:
      - nextcloud/config:/var/www/html/config
     environment:
      - MYSQL_PASSWORD=1234
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=q3it
      - MYSQL_HOST=db

He modificado el password de la base de datos, el nombre de usuario y volumen de configuración. ¿Que hará esto? Creará la base de datos con MariaDB y la imagen de Nexcloud.
 
Ahora, ejecutamos la siguiente instrucción para levantar el contenedor...
 
sudo docker compose up -d 
 

Verificamos que las dos imágenes están creadas y corriendo...
 
 
Para conectarnos con este servicio, vamos al navegador e ingresamos la ip de la máquina y el puerto 8080. 
 
 
Como vemos en la imagen está funcionando el servicio. Ahora nos pide que creemos una cuenta de administrador. 
 

Ingresamos...
 
 
A partir de aquí tendríamos a Nextcloud funcionando correctamente. Pero si yo quiero que mi conexión sea al nombre de dominio nextcloud.docker.q3it y no a la ip ¿Cómo lo podríamos hacer? Lo primero es modificar el fichero /etc/hosts del CentOS y asociar ese nombre con la ip.
 

Si intentamos entrar a esa url, esto es lo que pasa...
 

Para solucionar esto debemos ir al directorio config/config.php que nos pone en el mensaje y asociar ese nombre de dominio con la ip. Este directorio se creó con la instalación y se encuentra en la ruta de la imagen.
 

Entramos al fichero...
 

Modificamos la última línea, donde asocia la 192.168.1.123 con el dominio nextcloud.docker.q3it. También podemos eliminar el puerto 8080 para que se comunique por defecto por el 80 y así omitir el puerto en la conexión.
 
 
Probemos la conexión....
 

👏👏 Resuelve a esa dirección. Sólo quedaría loguearnos y listo 👍.
 
Ampliación 
Cuando utilizamos una nube personal, una de las cosas que nos gustaría hacer es poder acceder a ella a través de una red WAN, esto se puede hacer de varias maneras:
 
1- Acceder por un puerto abierto en nuestro Router. El concepto de esta practica lo expliqué en el post de ssh
 
 
Una vez abiertos los puertos, debemos configurar el fichero config.php y añadir nuestra ip pública para que la reconozca como una ip de confianza.
 
2- Acceder a la máquina local por medio de una VPN. En el post de OpenVPN explico cómo acceder desde el exterior a una ip local. La metodología a seguir es muy fácil, sólo es configurar hacia donde queremos dirigir esa comunicación.
 
3- Acceso con un dominio registrado en la web. Cuando se accede por medio de un dominio público, lo normal es que la empresa que presta este servicio te de las facilidades para configurar tu conexión: Contratar un certificado SSL, resolver las peticiones por medio de sus servidores DNS, etc. Pero si sólo tenemos el nombre de dominio, el resto lo tenemos que hacer de forma local, instalando Bin9 para que resuelva a ese nombre de dominio, configurar un certificado SSL autofirmado, abrir puertos seguros, etc.
 
4- Acceso a una instancia. Lo primero es entender que una instancia informática es una máquina virtual (VM), que se ejecuta en un hardware físico independiente. Teniendo esto claro, lo que necesitamos es migrar nuestra máquina a una organización que preste este servicio, cómo: Amazon EC2, Microsoft Azure, Google Platform, etc. Para el proceso de migración hay que tener en cuenta, la arquitectura, la conectividad, los sistemas operativos que soporta, el tipo de cuenta, etc. Ahora solo queda ser muy meticulosos y leer muy bien la guía ofrecida por el proveedor del servicio para terminar con éxito este proceso.