Se recomienda realizar una previa lectura del post Configuración de cliente OpenVPN con certificados X.509, pues en este artículo se tratarán con menor profundidad u obviarán algunos aspectos vistos con anterioridad.
El objetivo de ésta tarea es el de crear el escenario de trabajo que se va a usar durante todo el curso en OpenStack, que va a constar inicialmente de 3 instancias con nombres relacionados con el libro “Don Quijote de la Mancha”. La infraestructura a la que se pretende llegar es la siguiente:
-
Dulcinea:
- Debian Buster sobre un volumen de 10GB con sabor m1.mini.
- Acessible a través de la red externa 10.0.0.0/24 con una IP flotante.
- Conectada a la red interna 10.0.1.0/24.
-
Sancho:
- Ubuntu 20.04 sobre un volumen de 10GB con sabor m1.mini.
- Conectada a la red interna 10.0.1.0/24.
-
Quijote:
- CentOS 7 sobre un volumen de 10GB con sabor m1.mini.
- Conectada a la red interna 10.0.1.0/24.
Como se puede apreciar, en el escenario tendremos una red externa con direccionamiento 10.0.0.0/24 que cuenta con salida a Internet a través de un router situado en la dirección 10.0.0.1. Una de las interfaces de Dulcinea se encontrará dentro de dicha red. La red en cuestión viene creada por defecto.
De otro lado, tendremos una red interna con direccionamiento 10.0.1.0/24, en la que se encontrarán las tres máquinas. Si lo pensamos, dicha red no tiene salida a Internet, de manera que las máquinas que se encuentren ahí no podrán salir. Para solucionarlo, vamos a configurar NAT en Dulcinea, concretamente un SNAT, para que así tengan conectividad a través de la misma. La red en cuestión hay que crearla manualmente, así que vamos a ponernos manos a la obra.
Partimos un punto en el que ya hemos configurado la VPN para poder tener acceso remoto a dichas máquinas, que se encuentran en el departamento de informática del IES Gonzalo Nazareno, así que accederemos a jupiter.gonzalonazareno.org, que resolverá estáticamente a 172.22.222.1, de manera que accederemos con nuestro usuario y procederemos a crear la red.
Creación de la red interna
Para ello, accederemos en el menú izquierdo al apartado RED, dentro del cuál pulsaremos en Redes. Una vez ahí, pulsaremos en el botón Crear red y estableceremos los siguientes parámetros:
-
Red:
- Nombre de la red: red interna de alvaro.vaca
- Estado de administración: ARRIBA
- Compartido: No
- Crear subred: Sí
-
Subred:
- Nombre de subred: Vacío
- Direcciones de red: 10.0.1.0/24
- Versión de IP: IPv4
- Deshabilitar puerta de enlace: Sí
-
Detalles de Subred:
- Habilitar DHCP: Sí
- Pools de asignación: 10.0.1.2,10.0.1.254
- Servidores DNS: 192.168.200.2
Gracias a la configuración mencionada, habremos evitado que el servidor DHCP sirva una puerta de enlace predeterminada a las máquinas (pues nos podría haber causado algunos conflictos con Dulcinea, ya que se encuentra dentro de las dos redes). Además, hemos habilitado el servidor DHCP para que sirva direcciones IP a las máquinas, ya que de primeras, necesitaremos una dirección para acceder a las mismas (aunque posteriormente configuraremos un direccionamiento estático). El resultado final sería:
Genial, ya hemos creado la red interna que vamos a necesitar, de manera que ya tenemos las dos redes (externa e interna) configuradas y operativas.
Creación de las instancias
El primer paso será crear los volúmenes que utilizarán las correspondientes instancias. Para ello, accederemos en el menú izquierdo al apartado COMPUTE, dentro del cuál pulsaremos en Volúmenes. Una vez ahí, pulsaremos en el botón Crear volumen y estableceremos los siguientes parámetros para cada uno de los volúmenes:
-
Dulcinea:
- Nombre del volumen: Dulcinea
- Descripción: Vacío
- Origen del volumen: Imagen
- Utilizar una imagen como origen: Debian Buster 10.6 (516,5 MB)
- Tipo: Sin tipo de volumen
- Tamaño (GiB): 10
- Zona de Disponibilidad: nova
-
Sancho:
- Nombre del volumen: Sancho
- Descripción: Vacío
- Origen del volumen: Imagen
- Utilizar una imagen como origen: Ubuntu 20.04 LTS (focal fossa) (522,2 MB)
- Tipo: Sin tipo de volumen
- Tamaño (GiB): 10
- Zona de Disponibilidad: nova
-
Quijote:
- Nombre del volumen: Quijote
- Descripción: Vacío
- Origen del volumen: Imagen
- Utilizar una imagen como origen: CentOS 7 (819,0 MB)
- Tipo: Sin tipo de volumen
- Tamaño (GiB): 10
- Zona de Disponibilidad: nova
El resultado final tras haber generado los 3 volúmenes sería:
Los volúmenes que van a ser utilizados por las instancias ya se encuentran generados, así que no queda nada más por hacer antes de proceder a crear las correspondientes instancias, por lo que vamos a ponernos manos a la obra. Para ello, accederemos en el menú izquierdo al apartado COMPUTE, dentro del cuál pulsaremos en Instancias. Una vez ahí, pulsaremos en el botón Lanzar instancia y estableceremos los siguientes parámetros para cada una de las instancias:
-
Dulcinea:
-
Details:
- Instance Name: Dulcinea
- Zona de Disponibilidad: nova
- Count: 1
-
Source:
- Seleccionar Origen de arranque: Volumen
- Delete Volume on Instance Delete: No
- Allocated: Dulcinea
-
Sabor:
- Allocated: m1.mini
-
Redes:
- Allocated: red de alvaro.vaca
- Allocated: red interna de alvaro.vaca
-
Par de claves:
- Allocated: Linux
-
Details:
-
Sancho:
-
Details:
- Instance Name: Sancho
- Zona de Disponibilidad: nova
- Count: 1
-
Source:
- Seleccionar Origen de arranque: Volumen
- Delete Volume on Instance Delete: No
- Allocated: Sancho
-
Sabor:
- Allocated: m1.mini
-
Redes:
- Allocated: red interna de alvaro.vaca
-
Par de claves:
- Allocated: Linux
-
Details:
-
Quijote:
-
Details:
- Instance Name: Quijote
- Zona de Disponibilidad: nova
- Count: 1
-
Source:
- Seleccionar Origen de arranque: Volumen
- Delete Volume on Instance Delete: No
- Allocated: Quijote
-
Sabor:
- Allocated: m1.mini
-
Redes:
- Allocated: red interna de alvaro.vaca
-
Par de claves:
- Allocated: Linux
-
Details:
Las instancias ya han sido generadas, pero todavía no tenemos acceso a ninguna de ellas, pues las redes a las que pertenecen no son accesibles por nosotros (al menos de forma directa), de manera que debemos asignarle a aquella instancia capaz de salir a Internet una IP flotante, en este caso, a Dulcinea. Una IP flotante no es más que un router virtual con dos interfaces, la primera de ellas conectada a la red accesible por nosotros, es decir, a 172.22.0.0/16 y la segunda, a la red no accesible directamente, es decir, a 10.0.0.0/24.
Para ello, volveremos a la lista de nuestras instancias creadas y en pulsaremos en el símbolo ▾ en Dulcinea, para así abrir el desplegable. Tras ello, pulsaremos en la opción Asociar IP flotante y le asignaremos una de las disponibles. El resultado final sería:
Como se puede apreciar, las direcciones IP asignadas han sido las siguientes:
-
Dulcinea:
- 10.0.0.7 - 172.22.200.134
- 10.0.1.9
-
Sancho:
- 10.0.1.4
-
Quijote:
- 10.0.1.5
Si recordamos, con anterioridad hemos añadido a las 3 instancias un par de claves de nombre Linux. Éste par de claves es personal y lo utilizaré para conectarme por primera vez a las instancias, ya que por defecto no tienen ninguna contraseña establecida. Si lo pensamos, hay un pequeño problema, y es que para conectarnos a las instancias Sancho y Quijote, no podremos hacerlo de forma directa desde la máquina anfitriona, dado que se encuentran en la red privada, sino que tendremos que establecer una conexión con Dulcinea y desde ahí, establecer la conexión con las otras dos instancias.
Es por ello que tendremos que hacer uso de una opción de ssh
, para así poder usar el par de claves Linux en la máquina Dulcinea a la hora de conectarnos a las otras dos instancias, pero sin necesidad de copiar la clave privada a dicha máquina, pues supondría un agujero de seguridad bastante grande.
Lo primero que tendremos que hacer es añadir la clave privada a nuestro agente de claves de la sesión en nuestra máquina anfitriona, haciendo para ello uso de ssh-add
, que recibirá la ruta de la clave privada que deseamos añadir:
Como se puede apreciar en la salida del comando, la clave ha sido correctamente añadida, así que todo está preparado para realizar la conexión ssh a la dirección 172.22.200.134, ejecutando para ello el comando:
Donde:
- -A: Indica a SSH que herede el agente con las claves privadas almacenadas, que podrán ser utilizadas dentro de dicha instancia.
Ya nos encontramos dentro de la máquina. Para verificar que las interfaces de red se han generado correctamente, ejecutaremos el comando:
Efectivamente, contamos con dos interfaces:
- eth0: Conectada a la red externa, con dirección IP 10.0.0.7.
- eth1: Conectada a la red interna, con dirección IP 10.0.1.9.
La configuración de red parece estar bien, pero todavía no hemos llevado a cabo la prueba de fuego, consistente en comprobar la conectividad con las otras dos máquinas, de manera que haremos uso del comando ping
para probar la conectividad con 10.0.1.4 (Sancho) y 10.0.1.5 (Quijote):
Efectivamente, existe conectividad entre las máquinas, así que antes de empezar a trabajar en las instancias, vamos a verificar que también podemos llevar a cabo una conexión ssh
a las mismas, tratando de acceder primero a 10.0.1.4 (Sancho):
Efectivamente, Dulcinea ha podido llevar a cabo la conexión ssh
con Sancho, así que cerraremos dicha conexión y volveremos a intentar conectarnos esta vez a 10.0.1.5 (Quijote):
Como era de esperar, la conexión ssh también se ha llevado a cabo correctamente, gracias a haber exportado nuestro agente de claves de la máquina anfitriona, de manera que Dulcinea puede hacer uso de las mismas.
Definición de contraseña en todas las instancias
Como se ha mencionado con anterioridad, las instancias no vienen con una contraseña configurada, por lo que tendremos que establecerla manualmente para evitar perder el acceso a las mismas en caso que hubiese algún tipo de problema, pues en ese caso, podríamos acceder desde Horizon. La sintaxis para establecer una contraseña es (dicha sintaxis es genérica, por lo que nos servirá en las tres distribuciones):
Donde:
- usuario: Indicamos el usuario cuya contraseña queremos modificar. En Dulcinea es debian, en Sancho es ubuntu y en Quijote es centos.
Dulcinea
Sancho
Quijote
Configuración de NAT en Dulcinea
Actualmente, las máquinas Sancho y Quijote no tienen salida a Internet, puesto que van a salir a través de una máquina que se encuentra conectada a ambas redes (externa e interna), que va a actuar como router haciendo SNAT, en este caso Dulcinea. Dicha máquina viene configurada con un grupo de seguridad que se asigna por defecto durante su creación, es decir, cuenta con unas reglas de cortafuegos que no necesitamos, pues nosotros queremos configurar nuestras propias reglas para hacer SNAT. Dicha configuración no se puede llevar a cabo desde Horizon, sino que tendremos que usar el cliente desde la terminal, por lo que vamos a proceder a configurarlo.
El primer paso será crear un entorno virtual en Python en nuestra máquina anfitriona, de manera que debemos instalar previamente el paquete necesario para ello (python3-venv), además de otro paquete que requiere el cliente de OpenStack para funcionar (python3-dev), ejecutando para ello el comando:
En mi caso, me he movido al directorio virtualenv/ (haciendo uso de cd
), pues es donde tengo alojados todos los entornos virtuales, y por consecuencia, donde alojaré el que voy a crear. En ésta ocasión, el nombre que le voy a asignar al entorno virtual es openstackclient, así que lo generaré ejecutando el comando:
Una vez creado, tendremos que iniciarlo haciendo uso de source
con el binario activate que se encuentra contenido en el directorio bin/:
Una vez activado, ya podremos proceder a instalar dicho cliente haciendo uso de pip
. El paquete en cuestión se llama python-openstackclient, así que para instalarlo, haremos uso del comando:
Una vez instalado, tendremos que descargar el fichero RC necesario para el funcionamiento de dicho cliente. Para ello, volveremos a Horizon y accederemos en el menú izquierdo al apartado COMPUTE, dentro del cuál pulsaremos en Acceso y seguridad. Una vez ahí, nos posicionaremos dentro de Acceso a la API y pulsaremos en el botón Descargar fichero RC de OpenStack v3.
Dado que actualmente se está utilizando una versión de OpenStack con TLS, es necesario indicar en dicho fichero una variable de entorno (OS_CACERT) con la ruta del certificado del IES Gonzalo Nazareno firmado por la autoridad certificadora:
La línea para declarar la correspondiente variable ya ha sido añadida, así que ya podremos ejecutar dicho script que llevará a cabo toda la configuración necesaria en la máquina anfitriona para establecer la conexión (configurará una serie de variables de entorno tales como la URL a la que conectar, el nombre de usuario…). Para ello, ejecutaremos el comando:
Como se puede apreciar, nos ha pedido la contraseña de nuestro proyecto y la ha almacenado en una variable de entorno en texto plano. Tras ello, ya tendremos todo configurado y podremos proceder a listar las instancias existentes en nuestro proyecto para así verificar que funciona correctamente. El comando a ejecutar sería:
Efectivamente, el cliente de OpenStack se encuentra actualmente operativo y nos ha mostrado la información referente a las instancias creadas en mi proyecto. Tras ello, procederemos a eliminar el grupo de seguridad por defecto (default) en Dulcinea, ejecutando para ello el comando:
En teoría el grupo de seguridad ya ha sido eliminado, pero para verificarlo, vamos a listar la información detallada sobre la instancia Dulcinea, haciendo uso del comando:
Efectivamente, podemos concluir que el grupo de seguridad ha sido correctamente eliminado, ya que no aparece ningún apartado de nombre security_groups.
Ésto no es todo, ya que también tenemos que deshabilitar la seguridad en los correspondientes puertos de la máquina, ya que cuando una máquina no tiene ningún grupo de seguridad asignado, el modus operandi por defecto es el de bloquear la conexión en todos los puertos asociados a la misma. Para ello, vamos a listar primero los puertos existentes en nuestro proyecto, ejecutando el comando:
Aquí podemos ver todos los puertos existentes en nuestro proyecto, por lo que tendremos que buscar los identificadores (ID) de aquellos puertos asociados a Dulcinea, es decir, los asociados a las direcciones IP 10.0.0.7 y 10.0.1.9:
- 10.0.0.7: 488dc43f-3a9b-4981-8cf7-bc6cbcf82203
- 10.0.1.9: 0aab3e9c-c2c9-46c2-b6ed-e33447107554
Tras ello, tendremos que deshabilitar la seguridad en dichos puertos, indicando para ello el identificador en cuestión, haciendo uso de los comandos:
Listo, ya hemos deshabilitado la seguridad en los mismos, de manera que ya tenemos accesible todo el rango de puertos, así que ya podemos comenzar a configurar NAT en Dulcinea. Es importante mencionar que deshabilitar el cortafuegos es una acción un tanto precipitada, por lo que únicamente debe llevarse a cabo en un entorno controlado.
Lo primero que tendremos que hacer será activar el bit de forward, permitiendo así que los paquetes puedan pasar de una interfaz a otra en el servidor, ya que por defecto, en Debian viene deshabilitado por razones de seguridad. Además, haremos uso de sysctl
para que la modificación sea persistente tras un posible reinicio. Para ello, ejecutamos el comando (con permisos de administrador, ejecutando para ello el comando sudo su -
):
Gracias a la instrucción que acabamos de ejecutar, hemos añadido una línea al fichero de configuración sysctl.conf, el cuál contiene los valores de los parámetros del kernel, poniendo el valor del parámetro correspondiente para habilitar el bit de forward a 1. Sin embargo, el cambio todavía no ha entrado en vigor, ya que tendremos que volver a leer el contenido de dicho fichero para así cargar el valor del parámetro en memoria, ejecutando para ello el comando:
Como se puede apreciar, la salida del comando nos ha informado de que se ha percatado del cambio que acabamos de realizar en el fichero, por lo que el bit de forward se encuentra ya habilitado.
Tras ello, tendremos que instalar el paquete que nos va a permitir hacer NAT. En este caso se trata de nftables, un cortafuegos que consta con dicha funcionalidad. Para ello, actualizaremos previamente la paquetería para asegurarnos de que estamos trabajando con las últimas versiones e instalaremos el paquete:
Cuando el paquete haya terminado de instalarse, tendremos que arrancar y habilitar el demonio, de manera que se inicie cada vez que se arranque la máquina y lea la configuración almacenada en el fichero (lo veremos a continuación). Para ello, ejecutamos los comandos:
Una vez habilitado y arrancado el demonio, tendremos que crear una nueva tabla en nftables de nombre nat. Para ello, ejecutamos el comando:
Para verificar que la creación de dicha tabla se ha realizado correctamente, ejecutamos el comando:
Efectivamente, así ha sido. Dentro de dicha tabla tendremos que crear la cadena POSTROUTING, es decir, aquella que permite modificar paquetes justo antes de que salgan del equipo, permitiendo por tanto hacer Source NAT (SNAT), para posteriormente alojar dentro de la misma, la regla que necesitamos. Para crear dicha cadena ejecutaremos el comando:
En este caso, hemos especificado que esta cadena sea poco prioritaria (a mayor sea el número, menor es la prioridad), de manera que si en un futuro quisiéramos añadir una cadena PREROUTING, es decir, aquella que permite modificar paquetes entrantes antes de que se tome una decisión de enrutamiento, permitiendo por tanto hacer Destination NAT (DNAT), bastaría con indicarle a ésta última una prioridad más alta, de manera que las reglas albergadas en el interior de la cadena PREROUTING se ejecuten antes que las de la cadena POSTROUTING.
De nuevo, vamos a verificar que dicha cadena se ha generado correctamente, ejecutando para ello el comando:
Efectivamente, así ha sido. Nos queda un último paso, añadir la regla necesaria a la cadena POSTROUTING, de manera que nos permita hacer SNAT a la dirección de la interfaz de red perteneciente a la red externa, en este caso, la 10.0.0.7. Para ello, ejecutaremos el comando:
En este caso, hemos especificado que se trata de una regla para la cadena postrouting (pues debe aplicarse justo antes de salir de la máquina), además, la interfaz (oifname) que debemos introducir será aquella por la que van a salir los paquetes, es decir, la que está conectada a Internet (aunque sea haciendo doble o triple NAT, no es algo relevante en estas circunstancias), en este caso, eth0, además de indicar que esta regla la vamos a aplicar a todos aquellos paquetes que provengan de la red (ip saddr) 10.0.1.0/24. Por último, para aquellos paquetes que cumplan dicha regla, vamos a contarlos (counter) y a hacer SNAT a la dirección IP perteneciente a la red exterior (snat to) 10.0.0.7.
Por último, vamos a volver a verificar que dicha regla se ha añadido correctamente, ejecutando para ello el comando:
Efectivamente, así ha sido. Al igual que pasaba con el bit de forward, ésta configuración se encuentra cargada en memoria, por lo que para conseguir que perdure en el tiempo, vamos a ejecutar el comando:
Gracias a ello, habremos guardado la configuración en un fichero en /etc/ de nombre nftables.conf que se importará de forma automática cuando reiniciemos la máquina gracias al daemon que se encuentra habilitado. En caso de que no cargase de nuevo la configuración, podríamos hacerlo manualmente con el comando nft -f /etc/nftables.conf
.
Modificación de las instancias para que usen direccionamiento estático
Las direcciones IP asignadas a las interfaces de red de las máquinas han sido concedidas por DHCP, pero como todos sabemos, no es buena idea dejar direcciones dinámicas en los servidores, por lo que vamos a configurar direccionamiento estático en todas ellas (concretamente haciendo uso de las mismas direcciones que se nos han concedido por DHCP).
Dulcinea
El fichero de configuración en el que debemos establecer la configuración de las interfaces de red de una máquina Debian Buster es /etc/network/interfaces, así que lo modificaremos ejecutando el comando:
Dentro del mismo debemos introducir las siguientes líneas:
Como se puede apreciar, hemos declarado dos interfaces de red (una perteneciente a la red externa, eth0 y otra perteneciente a la red interna, eth1), cuya dirección IP estática es la misma que se le concedió en su momento por DHCP (10.0.0.7 para eth0 y 10.0.1.9 para eth1). Es importante mencionar que la puerta de enlace únicamente debe ser configurada para la interfaz eth0, que es la que tiene salida a Internet, concretamente a través del router situado en 10.0.0.1.
Las instancias Debian Buster de OpenStack vienen con un fichero /etc/resolv.conf dinámico, lo que quiere decir que se genera dinámicamente en cada arranque. El contenido del mismo incluye los dos servidores DNS existentes en el instituto, situados en las direcciones 192.168.202.2 y 192.168.200.2, pero personalmente, he tomado la decisión de añadir un tercer servidor DNS ubicado en Internet, para aumentar la disponibilidad. Al ser dinámico dicho fichero, no podemos modificarlo a mano ni tampoco indicar el servidor DNS en el /etc/network/interfaces, sino que tendremos que modificar el fichero /etc/resolvconf/resolv.conf.d/base e indicarlo ahí, de manera que lo tendrá en cuenta para la siguiente ocasión, ejecutando para ello el comando:
En este caso, el servidor DNS que he decidido añadir es 8.8.8.8, por lo que la apariencia de dicho fichero sería:
Genial, todos los cambios referentes a la red se han llevado a cabo, pero para que surtan efecto podemos reiniciar la máquina (comando reboot
) o bien reiniciar el servicio correspondiente, que es lo que nosotros haremos, pues estamos intentando simular una situación real, con servidores reales. Para ello, ejecutaremos el comando:
Tras unos segundos de espera mientras el servicio se reiniciaba, ya podremos apreciar los cambios que hemos realizado, ejecutando antes de nada el comando ip a
para verificar que las direcciones IP estáticas se han asignado correctamente:
Como se puede apreciar, las direcciones han sido correctamente configuradas estáticamente (podemos deducir que son estáticas ya que su valid_lft es forever). Además, vamos a comprobar que la puerta de enlace predeterminada también se ha configurado correctamente, ejecutando para ello el comando:
Efectivamente, así ha sido. Por último, vamos a comprobar los servidores DNS que se encuentran indicados en el fichero /etc/resolv.conf, haciendo uso del comando:
Como era de esperar, los servidores DNS se han configurado como deberían, además de haberse añadido el servidor 8.8.8.8, tal y como lo hemos establecido.
Sancho
Antes de llevar a cabo la configuración, vamos a comprobar que no tenemos conectividad con el exterior (todavía), tratando de hacer un ping
a 8.8.8.8, por ejemplo:
Efectivamente, la red es inaccesible, ya que ni siquiera tenemos configurada una puerta de enlace predeterminada.
El fichero de configuración en el que debemos establecer la configuración de las interfaces de red de una máquina Ubuntu 20.04 es /etc/netplan/50-cloud-init.yaml, pero al igual que ocurría con el fichero /etc/resolv.conf en la máquina Debian Buster, éste también se genera dinámicamente durante el arranque gracias a un estándar de nombre cloud-init, que debemos desactivar ejecutando el comando:
En realidad, lo que hemos hecho ha sido generar un fichero de nombre 99-disable-network-config.cfg en /etc/cloud/cloud.cfg.d/, con un determinado contenido que evita por lo tanto que se genere el fichero de configuración de red durante cada arranque, permitiendo así llevar a cabo configuraciones estáticas que perduren en el tiempo. Una vez que lo hayamos desactivado, ya podremos proceder a modificar el fichero /etc/netplan/50-cloud-init.yaml, ejecutando para ello el comando:
Dentro del mismo debemos introducir las siguientes líneas:
Como se puede apreciar, hemos declarado la única interfaz de red (correspondiente a la red interna, ens3), cuya dirección IP estática es la misma que se le concedió en su momento por DHCP (10.0.1.4). Es importante mencionar que la puerta de enlace ha de ser la dirección de la máquina Dulcinea perteneciente a la red interna (concretamente, 10.0.1.9), de manera que podrá hacer SNAT con los paquetes que le lleguen. Por último, estableceremos los dos servidores DNS existentes en el instituto, 192.168.202.2 y 192.168.200.2, además de un servidor extra para así aumentar la disponibilidad, como puede ser 8.8.8.8.
Genial, todos los cambios referentes a la red se han llevado a cabo, pero para que surtan efecto podemos reiniciar la máquina (comando reboot
) o bien volver a cargar la configuración del servicio correspondiente, que es lo que nosotros haremos, pues estamos intentando simular una situación real, con servidores reales. Para ello, ejecutaremos el comando:
Tras unos segundos de espera mientras la nueva configuración se aplicaba, ya podremos apreciar los cambios que hemos realizado, ejecutando antes de nada el comando ip a
para verificar que la dirección IP estática se ha asignado correctamente:
Como se puede apreciar, la dirección ha sido correctamente configurada estáticamente (podemos deducir que es estática ya que su valid_lft es forever). Además, vamos a comprobar que la puerta de enlace predeterminada también se ha configurado correctamente, ejecutando para ello el comando:
Efectivamente, así ha sido. Por último, vamos a comprobar los servidores DNS que se encuentran indicados en el fichero /etc/resolv.conf, haciendo uso del comando:
En este caso, los servidores DNS configurados no aparecen reflejados en dicho fichero ya que Ubuntu implementa por defecto un servidor DNS local, capaz de cachear las respuestas, consiguiendo por tanto una navegación más rápida, pero que internamente, hará uso de los servidores DNS que le hemos especificado anteriormente para dichas peticiones.
Para verificar que toda la configuración ha funcionado, vamos a tratar de hacer ping
a google.es, para así verificar también que la resolución de nombres se realiza correctamente:
Como era de esperar, ya tenemos salida a Internet a través de Dulcinea, así que aprovecharemos y llevaremos a cabo una actualización de la paquetería existente en la máquina, ejecutando para ello el comando:
Tras unos segundos, la paquetería se habrá actualizado y ya estaremos utilizando las últimas versiones de los correspondientes paquetes.
Quijote
Antes de llevar a cabo la configuración, vamos a comprobar que no tenemos conectividad con el exterior (todavía), tratando de hacer un ping
a 8.8.8.8, por ejemplo:
Efectivamente, la red es inaccesible, ya que ni siquiera tenemos configurada una puerta de enlace predeterminada.
El fichero de configuración en el que debemos establecer la configuración de las interfaces de red de una máquina CentOS 7 es /etc/sysconfig/network-scripts/ifcfg-eth0, pero al igual que ocurría en la máquina Sancho, éste fichero también se genera dinámicamente durante el arranque gracias al estándar cloud-init, que debemos desactivar ejecutando el comando:
En realidad, lo que hemos hecho ha sido generar un fichero de nombre cloud-init.disabled en /etc/cloud/, que evita por lo tanto que se genere el fichero de configuración de red durante cada arranque, permitiendo así llevar a cabo configuraciones estáticas que perduren en el tiempo. Una vez que lo hayamos desactivado, ya podremos proceder a modificar el fichero /etc/sysconfig/network-scripts/ifcfg-eth0, ejecutando para ello el comando:
Dentro del mismo debemos introducir las siguientes líneas:
Como se puede apreciar, hemos declarado la única interfaz de red (correspondiente a la red interna, eth0), cuya dirección IP estática es la misma que se le concedió en su momento por DHCP (10.0.1.5). Es importante mencionar que la puerta de enlace ha de ser la dirección de la máquina Dulcinea perteneciente a la red interna (concretamente, 10.0.1.9), de manera que podrá hacer SNAT con los paquetes que le lleguen. Por último, estableceremos los dos servidores DNS existentes en el instituto, 192.168.202.2 y 192.168.200.2, además de un servidor extra para así aumentar la disponibilidad, como puede ser 8.8.8.8.
Genial, todos los cambios referentes a la red se han llevado a cabo, pero para que surtan efecto podemos reiniciar la máquina (comando reboot
) o bien reiniciar el servicio correspondiente, que es lo que nosotros haremos, pues estamos intentando simular una situación real, con servidores reales. Para ello, ejecutaremos el comando:
Tras unos segundos de espera mientras el servicio se reiniciaba, ya podremos apreciar los cambios que hemos realizado, ejecutando antes de nada el comando ip a
para verificar que la dirección IP estática se ha asignado correctamente:
Como se puede apreciar, la dirección ha sido correctamente configurada estáticamente (podemos deducir que es estática ya que su valid_lft es forever). Además, vamos a comprobar que la puerta de enlace predeterminada también se ha configurado correctamente, ejecutando para ello el comando:
Efectivamente, así ha sido. Por último, vamos a comprobar los servidores DNS que se encuentran indicados en el fichero /etc/resolv.conf, haciendo uso del comando:
Como era de esperar, los servidores DNS se han configurado como deberían, además de haberse añadido el servidor 8.8.8.8, tal y como lo hemos establecido.
Para verificar que toda la configuración ha funcionado, vamos a tratar de hacer ping
a google.es, para así verificar también que la resolución de nombres se realiza correctamente:
Como era de esperar, ya tenemos salida a Internet a través de Dulcinea, así que aprovecharemos y llevaremos a cabo una actualización de la paquetería existente en la máquina, ejecutando para ello el comando:
Tras unos segundos, la paquetería se habrá actualizado y ya estaremos utilizando las últimas versiones de los correspondientes paquetes.
Modificación de la subred de la red interna, deshabilitando el servidor DHCP
Ya hemos configurado el direccionamiento estático en todas las máquinas, por lo que no será necesario tener activo el servidor DHCP, pues no le daremos ningún uso. Para deshabilitarlo, accederemos en el menú izquierdo al apartado RED, dentro del cuál pulsaremos en Redes. Una vez ahí, buscaremos la red interna (red interna de alvaro.vaca) y pulsaremos en el nombre de la misma. Cuando hayamos accedido a la red, tendremos varios subapartados, así que accederemos a Subredes y nos aparecerá la única que hemos creado, por lo que procederemos a editarla pulsando en Editar subred.
Se nos habrá abierto un pequeño menú, así que iremos a Detalles de subred, pues es donde se encuentra la configuración referente al servidor DHCP de la subred. Simplemente desmarcaremos la casilla Habilitar DHCP y guardaremos los cambios, pulsando para ello en Guardar. El servidor DHCP ya habrá sido deshabilitado, tal y como se puede apreciar:
Creación del usuario profesor en todas las instancias
En este caso, vamos a generar un nuevo usuario profesor en las tres instancias, en el que añadiremos las claves públicas de los profesores para que puedan acceder. Además, llevaremos a cabo la correspondiente configuración para que dicho usuario pueda ejecutar sudo
sin contraseña. La sintaxis para generar un nuevo usuario es (dicha sintaxis es genérica, por lo que nos servirá en las tres distribuciones):
Donde:
- usuario: Indicamos el usuario que queremos crear. En este caso, profesor.
- -m: Especificamos que cree un directorio personal para dicho usuario en caso de que no exista.
- -s: Especificamos el nombre de la shell que utilizará para el login. En este caso, /bin/bash.
Suponemos que el usuario ya se encuentra creado, así que nos cambiaremos de usuario para hacer uso del mismo, siguiendo la sintaxis (dicha sintaxis es genérica, por lo que nos servirá en las tres distribuciones):
Donde:
- usuario: Indicamos el usuario al que nos queremos cambiar. En este caso, profesor.
Como bien sabemos, las claves públicas autorizadas a acceder a nuestra máquina se encuentran en ~/.ssh/, dentro de un fichero de nombre authorized_keys, que actualmente no se encuentra creado, así que vamos a proceder a crear dicho directorio y dicho fichero e insertar las correspondientes claves públicas en su interior. Los comandos a ejecutar serían (dichos comandos son genéricos, por lo que nos servirán en las tres distribuciones, excepto en CentOS 7, que tendremos que utilizar vi
en lugar de nano
):
El directorio .ssh y el fichero authorized_keys se encuentran ya creados, conteniendo éste último, además, las claves públicas de los profesores.
Los ficheros y directorios se crean por defecto con unos determinados permisos UNIX que no son los que nosotros queremos, pues dicha información ha de ser confidencial y únicamente accesible por el usuario profesor, de manera que cambiaremos los permisos del directorio a 700 y los permisos del fichero a 600, ejecutando para ello los comandos (dichos comandos son genéricos, por lo que nos servirán en las tres distribuciones):
Listo, los permisos ya habrían sido modificados, así que nos queda un último paso, permitir que dicho usuario haga uso del comando sudo
sin que se le solicite una contraseña (pues actualmente no tiene, de manera que el único método de acceso al mismo es mediante par de claves SSH). Para ello debemos modificar el fichero /etc/sudoers y añadir una línea de la siguiente forma:
Donde:
-
usuario: Indicamos el usuario que queremos autorizar a ejecutar
sudo
sin contraseña. En este caso, profesor.
Gracias a echo
podremos añadir dicha línea sin tener que modificar el fichero con un editor, ejecutando para ello el comando (dicho comando es genérico, por lo que nos servirá en las tres distribuciones):
Tras ello, el usuario profesor ya podrá hacer uso de sudo
sin que se le requiera una contraseña.
Dulcinea
Sancho
Quijote
Configuración de resolución estática en las tres instancias
Dado que todavía no hemos configurado un servidor DNS, tendremos que configurar la resolución estática de nombres en las máquinas, de manera que se conozcan entre ellas. Dicha información está almacenada en el fichero /etc/hosts, así que tendremos que incluir en el mismo líneas con la siguiente sintaxis:
Donde:
- IP: La IP de la máquina que queremos resolver.
- FQDN: El Fully Qualified Domain Name, que se encuentra compuesto por [hostname].alvaro.gonzalonazareno.org.
- hostname: El nombre corto de la máquina.
En cada máquina debemos introducir dos líneas (de manera que conozca las otras dos máquinas restantes, además de a sí misma, modificando o añadiendo la línea 127.0.1.1), es decir:
- Dulcinea: Debe conocer a Sancho, a Quijote y a sí misma.
- Sancho: Debe conocer a Dulcinea, a Quijote y a sí misma.
- Quijote: Debe conocer a Dulcinea, a Sancho y a sí misma.
Para llevar a cabo dicha modificación, haremos uso del comando (dicho comando es genérico, excepto para CentOS 7, que tendremos que utilizar vi
en lugar de nano
):
Tras ello, ya podremos hacer ping
, por ejemplo, y las máquinas deben responder en caso de hacer uso tanto del FQDN como del hostname.
Dulcinea
En la máquina Debian Buster hay una pequeña peculiaridad, y es que el fichero /etc/hosts se genera dinámicamente durante el arranque, gracias al estándar cloud-init, así que para deshabilitarlo y así conseguir un fichero estático, tendremos que cambiar el valor de la directiva manage_etc_hosts a false en el fichero /etc/cloud/cloud.cfg. Para ello, ejecutaremos el comando:
Para verificar que el valor de dicha directiva ha sido modificado, vamos a visualizar el contenido del fichero, estableciendo un filtro por nombre:
Efectivamente, su valor ha cambiado, así que ya podemos proceder a modificar el fichero /etc/hosts y a realizar las correspondientes pruebas:
Sancho
Quijote
En las máquinas CentOS 7 de OpenStack existe una peculiaridad, y es que el hostname que se asigna por defecto durante la creación es [hostname].novalocal, cosa que no necesitamos, ya que llega a provocar incluso conflictos con el FQDN. Para llevar a cabo dicha modificación, podríamos hacer uso del comando hostnamectl
o bien, modificar a mano el fichero /etc/hostname, que es lo que haré en mi caso. Para ello, ejecutaremos el comando:
Y modificaremos el contenido a lo siguiente:
Genial, ya hemos llevado a cabo el cambio necesario, pero para que surta efecto podemos reiniciar la máquina (comando reboot
) o bien cerrar la sesión y volver a abrirla, que es lo que nosotros haremos, pues estamos intentando simular una situación real, con servidores reales. En caso de que tampoco muestre el nuevo hostname, podríamos modificar directamente el fichero /proc/sys/kernel/hostname, de manera que el cambio entraría en vigor automáticamente. Tras ello, ya podremos proceder a llevar a cabo las modificaciones oportunas para establecer la resolución estática:
Sincronización del reloj de las instancias utilizando un servidor NTP externo
El Network Time Protocol (NTP) es un protocolo de Internet para sincronizar los relojes de los sistemas informáticos muy utilizado hoy en día, principalmente en empresas, pues es altamente recomendable que todas las máquinas existentes tengan la hora sincronizada entre sí.
Dulcinea
Para comprobar si nuestro servidor tiene actualmente sincronizado el reloj haciendo uso de un servidor NTP, ejecutaremos el comando:
Como se puede apreciar, nos ha mostrado la información referente a la hora de nuestra máquina. Sin embargo, podemos apreciar que el estado del NTP service es inactive, y que por tanto el reloj del sistema no se encuentra sincronizado (System clock synchronized).
Para tratar de solucionarlo, vamos a ver el estado del servicio systemd-timesyncd.service, uno de los daemon que se puede encargar de gestionar la hora en las máquinas, para aquellas que estén corriendo systemd (pues no es necesario hacer uso del daemon ntpd). Para ello, ejecutaremos el comando:
Como se puede apreciar, el servicio se encuentra actualmente inactivo, por lo que trataremos de reiniciarlo para que así arranque, ejecutando para ello el comando:
Una vez más, mostraremos el estado del servicio para verificar si ha podido arrancar:
Como se puede apreciar, en ésta ocasión tampoco ha podido arrancar, ya que aparentemente hay un conflicto entre ntpd y systemd-timesyncd, por lo que vamos a eliminar el primero de ellos, ejecutando para ello el comando:
Antes de tratar de arrancar de nuevo el servicio, vamos a modificar el fichero de configuración del mismo (/etc/systemd/timesyncd.conf) para así indicarle el servidor que tendrá que usar para la sincronización. Lo recomendable es que sea lo más cercano a nosotros geográficamente hablando. En este caso, he elegido es.pool.ntp.org, así que para modificar dicho fichero ejecutaremos el comando:
Listo, el servidor que ha de usar ya ha sido especificado, así que volveremos a reiniciar el servicio y a comprobar su estado:
En ésta ocasión, sí ha sido capaz de arrancar (active) y de sincronizarse con dicho servidor, tal y como podemos apreciar en el último mensaje mostrado.
Todavía no hemos terminado, ya que cuando ejecuté el comando timedatectl
, me mostraba una hora menos de la hora local, es decir, había un problema con la zona horaria, por lo que debemos modificarla manualmente. Para ver las zonas horarias disponibles, ejecutaremos el comando:
En mi caso, me quedaré con la hora de España (Europe/Madrid), así que para modificar la zona horaria, ejecutaremos el comando:
En un principio, la hora ya debe estar completamente sincronizada y adaptada a nuestra hora local, así que volveremos a ejecutar timedatectl
para verificarlo:
Efectivamente, el servicio NTP ya se encuentra activo y el reloj del sistema sincronizado, por lo que ya muestra la hora local real (20:57:16).
Sancho
Para comprobar si nuestro servidor tiene actualmente sincronizado el reloj haciendo uso de un servidor NTP, ejecutaremos el comando:
Como se puede apreciar, nos ha mostrado la información referente a la hora de nuestra máquina. Sin embargo, y a diferencia de la máquina anterior, podemos apreciar que el estado del NTP service es active, y que por tanto el reloj del sistema se encuentra sincronizado (System clock synchronized), pero no haciendo uso del servidor es.pool.ntp.org, sino de uno que viene por defecto, así que para una mayor precisión, procederemos a modificarlo manualmente, haciendo uso del fichero /etc/systemd/timesyncd.conf:
Listo, el servidor que ha de usar ya ha sido especificado, así que procederemos a reiniciar el servicio y a comprobar su estado:
En ésta ocasión, ha sido capaz de sincronizarse con dicho servidor, tal y como podemos apreciar en el último mensaje mostrado.
Todavía no hemos terminado, ya que cuando ejecuté el comando timedatectl
, me mostraba una hora menos de la hora local, es decir, había un problema con la zona horaria, por lo que debemos modificarla manualmente, tal y como hemos hecho en la anterior máquina, ejecutando para ello el comando:
En un principio, la hora ya debe estar completamente sincronizada y adaptada a nuestra hora local, así que volveremos a ejecutar timedatectl
para verificarlo:
Efectivamente, el servicio NTP ya se encuentra activo y el reloj del sistema sincronizado, por lo que ya muestra la hora local real (21:01:59).
Quijote
En el caso de CentOS 7, no se hace uso de systemd-timesyncd para la sincronización NTP, sino de chronyd, pero la filosofía es exactamente la misma.
Para comprobar si nuestro servidor tiene actualmente sincronizado el reloj haciendo uso de un servidor NTP, ejecutaremos el comando:
Como se puede apreciar, nos ha mostrado la información referente a la hora de nuestra máquina. Al igual que ocurría en la máquina anterior, el reloj del sistema se encuentra sincronizado (NTP synchronized), pero no haciendo uso del servidor es.pool.ntp.org, sino de unos que vienen por defecto, así que para una mayor precisión, procederemos a modificarlo manualmente, haciendo uso del fichero /etc/chrony.conf, en el que comentaremos los anteriores servidores y estableceremos el nuevo:
Listo, el servidor que ha de usar ya ha sido especificado, así que procederemos a reiniciar el servicio y a comprobar su estado:
En ésta ocasión, ha sido capaz de sincronizarse con dicho servidor, tal y como podemos apreciar en el último mensaje mostrado.
Todavía no hemos terminado, ya que cuando ejecuté el comando timedatectl
, me mostraba una hora menos de la hora local, es decir, había un problema con la zona horaria, por lo que debemos modificarla manualmente, tal y como hemos hecho en las anteriores ocasiones, ejecutando para ello el comando:
En un principio, la hora ya debe estar completamente sincronizada y adaptada a nuestra hora local, así que volveremos a ejecutar timedatectl
para verificarlo:
Efectivamente, el servicio NTP ya se encuentra activo y el reloj del sistema sincronizado, por lo que ya muestra la hora local real (21:10:59).