Cloud Computing IaaS. OpenStack
¿Qué es OpenStack?
OpenStack es un software de código abierto que permite la creación de infraestructuras de nube privada. Es decir, permite crear una nube privada en la que los usuarios pueden crear máquinas virtuales, almacenar datos, etc.
En esta entrada vamos a realizar una serie de pequeños talleres de configuración y gestión.
Configuración del cliente VPN
Para poder acceder a la red local desde el exterior, existe una red privada configurada con OpenVPN que utiliza certificados x509 para autenticar los usuarios y el servidor.
Para ello, vamos a conectarnos desde mi red local a la VPN del centro. Para ello, vamos a utilizar el cliente OpenVPN.
Lo único que vamos a necesitar son dos cosas:
- Disponer de un certificado x509 para autenticarnos en el servidor.
- Configurar el cliente OpenVPN con la configuración del servidor.
Pasos a seguir
Lo primero que deberemos hacer es crear una solicitud de firma del certificado.
¿Cómo? Pues muy sencillo, vamos a utilizar el comando openssl para generar una solicitud de firma de certificado.
maria@maria-debian:~ openssl genrsa 4096 > /etc/ssl/private/[nombredemimaquina].key
Una vez generado el certificado, vamos a generar la solicitud de firma.
maria@maria-debian:~ openssl req -new -key /etc/ssl/private/[nombredemimaquina].key -out /root/[nombredemimaquina].csr
Nos pedirá una serie de valores para identificar al certificado, que tendremos que rellenar correctamente y son:
C=ES
ST=Sevilla
L=Dos Hermanas
O=IES Gonzalo Nazareno
OU=Informatica
CN=[Nombre del equipo] (debe ser único)
Una vez generado el certificado, lo tendremos que enviar al administrador de la red para que nos lo firme y nos lo envíe, (en este caso, el profesor del centro).
Tras haber recibido el certificado, lo tendremos que instalar en el equipo. Para ello tendremos que tener instalado el cliente OpenVPN.
Una vez nstalado, debemos crear un fichero con extensión .conf en el directorio /etc/openvpn/ con el siguiente contenido:
dev tun
remote sputnik.gonzalonazareno.org
ifconfig 172.23.0.0 255.255.255.0
pull
proto tcp-client
tls-client
# remote-cert-tls server
ca /etc/ssl/certs/gonzalonazareno.crt <- Cambiar por la ruta al certificado de la CA Gonzalo Nazareno (el mismo que utilizamos para la moodle, redmine, etc.)
cert /etc/openvpn/mut-albertomolina.crt <- Cambiar por la ruta al certificado CRT firmado que nos han devuelto
key /etc/ssl/private/mut.key <- Cambiar por la ruta a la clave privada, aunque en ese directorio es donde debe estar y con permisos 600
comp-lzo
keepalive 10 60
log /var/log/openvpn-sputnik.log
verb 1
Reiniciamos el servicio y comprobaremos que se haya creado correctamente el tunel y que la regla de encaminamiento adicional para acceder a los equipos que pertenecen a la red local del centro se haya añadido correctamente.
maria@maria-debian:~ sudo systemctl restart
maria@maria-debian:~ ip route
También podremos comprobarlo a través de los mensajes del fichero /var/log/openvpn-sputnik.log.
Nota 1: Para que el servicio no se inicie de forma automática, podemos deshabilitarlo con el comando
systemctl disable openvpn.service.
Nota 2: No se nos debe olvidar actualizar el fichero /etc/hosts para que podamos acceder a los equipos de la red local del centro por su nombre.
Comprobación de funcionamiento
Desde mi red local de casa, y una vez configurada la IP del interfaz tun0, podemos comprobar que podemos acceder a los equipos de la red local del centro.
Gestión de redes en OpenStack
En esta sección vamos a ver cómo crear una red en OpenStack. Los siguientes pasos los vamos hacer con el cliente de OpenStack, y entraremos en Horizon para comprobar que, efectivamente, se ha creado correctamente.
-
Vamos a crear una red llamada
red-externay una subred con DHCP, DNS el192.168.202.2y direccionamiento192.168.0.0/24. Crearemos también un router y conectaremos ambas redes a este router.openstack network create red-externa+---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | UP | | availability_zone_hints | | | availability_zones | | | created_at | 2022-12-04T20:29:15Z | | description | | | dns_domain | None | | id | 50f75d96-bc22-4ce6-aab5-fbfac98032cc | | ipv4_address_scope | None | | ipv6_address_scope | None | | is_default | False | | is_vlan_transparent | None | | mtu | 1450 | | name | red-externa | | port_security_enabled | True | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | provider:network_type | None | | provider:physical_network | None | | provider:segmentation_id | None | | qos_policy_id | None | | revision_number | 1 | | router:external | Internal | | segments | None | | shared | False | | status | ACTIVE | | subnets | | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | updated_at | 2022-12-04T20:29:15Z | +---------------------------+--------------------------------------+openstack subnet create --network red-externa --subnet-range 192.168.0.0/24 --dhcp --gateway 192.168.0.1 --dns-nameserver 192.168.202.2 subred-externa+----------------------+--------------------------------------+ | Field | Value | +----------------------+--------------------------------------+ | allocation_pools | 192.168.0.2-192.168.0.254 | | cidr | 192.168.0.0/24 | | created_at | 2022-12-04T20:30:16Z | | description | | | dns_nameservers | 192.168.202.2 | | dns_publish_fixed_ip | None | | enable_dhcp | True | | gateway_ip | 192.168.0.1 | | host_routes | | | id | 77b06357-36d5-4aac-a06d-d048964939d5 | | ip_version | 4 | | ipv6_address_mode | None | | ipv6_ra_mode | None | | name | subred-externa | | network_id | 50f75d96-bc22-4ce6-aab5-fbfac98032cc | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | revision_number | 0 | | segment_id | None | | service_types | | | subnetpool_id | None | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | updated_at | 2022-12-04T20:30:16Z | +----------------------+--------------------------------------+
Crearemos también un router y conectaremos ambas redes a este router.
openstack router create router-externo
+-------------------------+--------------------------------------+
| Field | Value |
+-------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2022-12-04T20:31:24Z |
| description | |
| enable_ndp_proxy | None |
| external_gateway_info | null |
| flavor_id | None |
| id | 430c756a-e261-4aee-bbe1-dbcc5982fa4b |
| name | router-externo |
| project_id | 2aac00e135b84d868bd4cd6bca13cc5a |
| revision_number | 1 |
| routes | |
| status | ACTIVE |
| tags | |
| tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a |
| updated_at | 2022-12-04T20:31:24Z |
+-------------------------+--------------------------------------+
openstack router add subnet router-externo subred-externa
openstack router set router-externo --external-gateway ext-net
-
Crearemos una instancia llamada
maquina-routerque conectaremos a la nueva red y donde comprobaremos que la IP fija está en el redireccionamiento de la subred.-
Primero creamos el puerto con la IP fija:
openstack port create --network red-externa --fixed-ip ip-address=192.168.0.10 puerto-externo+-------------------------+-----------------------------------------------------------------------------+ | Field | Value | +-------------------------+-----------------------------------------------------------------------------+ | admin_state_up | UP | | allowed_address_pairs | | | binding_host_id | None | | binding_profile | None | | binding_vif_details | None | | binding_vif_type | None | | binding_vnic_type | normal | | created_at | 2022-12-04T20:33:10Z | | data_plane_status | None | | description | | | device_id | | | device_owner | | | device_profile | None | | dns_assignment | None | | dns_domain | None | | dns_name | None | | extra_dhcp_opts | | | fixed_ips | ip_address='192.168.0.10', subnet_id='77b06357-36d5-4aac-a06d-d048964939d5' | | id | 14cac4e6-0a06-44a2-9cd0-d0285c19981c | | ip_allocation | None | | mac_address | fa:16:3e:a8:c3:e0 | | name | puerto-externo | | network_id | 50f75d96-bc22-4ce6-aab5-fbfac98032cc | | numa_affinity_policy | None | | port_security_enabled | True | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | propagate_uplink_status | None | | qos_network_policy_id | None | | qos_policy_id | None | | resource_request | None | | revision_number | 1 | | security_group_ids | ea2781f0-7c84-46b5-873c-a4986b14f232 | | status | DOWN | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | trunk_details | None | | updated_at | 2022-12-04T20:33:10Z | +-------------------------+-----------------------------------------------------------------------------+ -
Creamos la instancia y conectamos el puerto creado anteriormente:
openstack server create --flavor m1.mini \ --image "Debian 11 Bullseye" \ --security-group default \ --key-name pass \ --port puerto-externo \ maquina-router+-----------------------------+------------------------------------------------------------------+ | Field | Value | +-----------------------------+------------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | | | OS-EXT-STS:power_state | NOSTATE | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | None | | OS-SRV-USG:terminated_at | None | | accessIPv4 | | | accessIPv6 | | | addresses | | | adminPass | dBkgyGGPNFd8 | | config_drive | | | created | 2022-12-04T20:34:38Z | | flavor | m1.mini (3) | | hostId | | | id | 109737f8-3b6f-4af8-93dd-f6e53977562e | | image | Debian 11 Bullseye (6d992898-7e4f-44b9-a681-6dcf32d24a1f) | | key_name | pass | | name | maquina-router | | progress | 0 | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | properties | | | security_groups | name='ea2781f0-7c84-46b5-873c-a4986b14f232' | | status | BUILD | | updated | 2022-12-04T20:34:38Z | | user_id | 96a8e1784a38a07b78e6b0d2ac823603b2590a618dd18748ebd450bed2a376a9 | | volumes_attached | | +-----------------------------+------------------------------------------------------------------+ -
¿Podremos aignarle una IP flotante?
- Si, porque está diractamente conectada con la red externa.
maria@maria-debian:~$ openstack floating ip create ext-net +---------------------+--------------------------------------+ | Field | Value | +---------------------+--------------------------------------+ | created_at | 2022-12-04T20:35:28Z | | description | | | dns_domain | None | | dns_name | None | | fixed_ip_address | None | | floating_ip_address | 172.22.201.223 | | floating_network_id | 2ebd4d15-00e3-44c6-a9a7-aeebef5f6540 | | id | e7075044-807b-4a69-87df-efb96b237358 | | name | 172.22.201.223 | | port_details | None | | port_id | None | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | qos_policy_id | None | | revision_number | 0 | | router_id | None | | status | DOWN | | subnet_id | None | | tags | [] | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | updated_at | 2022-12-04T20:35:28Z | +---------------------+--------------------------------------+ openstack server add floating ip maquina-router 172.22.201.223
-
-
Creamos una nueva red llamada
red-internacon una subred con DHCP, DNS el192.168.202.2y direccionamiento10.0.100.0/24.openstack network create red-interna+---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | UP | | availability_zone_hints | | | availability_zones | | | created_at | 2022-12-04T20:36:32Z | | description | | | dns_domain | None | | id | 883c8952-21e8-48a1-8cf0-0418e8e592d7 | | ipv4_address_scope | None | | ipv6_address_scope | None | | is_default | False | | is_vlan_transparent | None | | mtu | 1450 | | name | red-interna | | port_security_enabled | True | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | provider:network_type | None | | provider:physical_network | None | | provider:segmentation_id | None | | qos_policy_id | None | | revision_number | 1 | | router:external | Internal | | segments | None | | shared | False | | status | ACTIVE | | subnets | | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | updated_at | 2022-12-04T20:36:32Z | +---------------------------+--------------------------------------+openstack subnet create --network red-interna --subnet-range 10.0.100.0/24 --dhcp --gateway 10.0.100.1 --dns-nameserver 192.168.202.2 subred-interna+----------------------+--------------------------------------+ | Field | Value | +----------------------+--------------------------------------+ | allocation_pools | 10.0.100.2-10.0.100.254 | | cidr | 10.0.100.0/24 | | created_at | 2022-12-04T20:37:21Z | | description | | | dns_nameservers | 192.168.202.2 | | dns_publish_fixed_ip | None | | enable_dhcp | True | | gateway_ip | 10.0.100.1 | | host_routes | | | id | 2b25eec7-cb6c-4fa8-a06e-651ab5e13f09 | | ip_version | 4 | | ipv6_address_mode | None | | ipv6_ra_mode | None | | name | subred-interna | | network_id | 883c8952-21e8-48a1-8cf0-0418e8e592d7 | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | revision_number | 0 | | segment_id | None | | service_types | | | subnetpool_id | None | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | updated_at | 2022-12-04T20:37:21Z | +----------------------+--------------------------------------+
-
Lo siguiente que realizaremos será conectar la
máquina-routera la nueva red y le asignamos la primera dirección:10.0.100.1.openstack port create --network red-interna --fixed-ip ip-address=10.0.100.1 puerto-interno+-------------------------+---------------------------------------------------------------------------+ | Field | Value | +-------------------------+---------------------------------------------------------------------------+ | admin_state_up | UP | | allowed_address_pairs | | | binding_host_id | None | | binding_profile | None | | binding_vif_details | None | | binding_vif_type | None | | binding_vnic_type | normal | | created_at | 2022-12-04T20:38:34Z | | data_plane_status | None | | description | | | device_id | | | device_owner | | | device_profile | None | | dns_assignment | None | | dns_domain | None | | dns_name | None | | extra_dhcp_opts | | | fixed_ips | ip_address='10.0.100.1', subnet_id='2b25eec7-cb6c-4fa8-a06e-651ab5e13f09' | | id | f795c9c0-3a3d-4b64-800e-8f1833716b38 | | ip_allocation | None | | mac_address | fa:16:3e💿a7:50 | | name | puerto-interno | | network_id | 883c8952-21e8-48a1-8cf0-0418e8e592d7 | | numa_affinity_policy | None | | port_security_enabled | True | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | propagate_uplink_status | None | | qos_network_policy_id | None | | qos_policy_id | None | | resource_request | None | | revision_number | 1 | | security_group_ids | ea2781f0-7c84-46b5-873c-a4986b14f232 | | status | DOWN | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | trunk_details | None | | updated_at | 2022-12-04T20:38:34Z | +-------------------------+---------------------------------------------------------------------------+openstack server add port maquina-router puerto-interno -
Creamos una nueva instancia llamada
maquina-clientey la conectamos a la red que hemos llamadored-interna. Usando los puertos de red, le asignaremos la IP10.0.100.200y comprobamos si su puerta de enlace es lamáquina-router.openstack port create --network red-interna --fixed-ip ip-address=10.0.100.200 puerto-cliente+-------------------------+-----------------------------------------------------------------------------+ | Field | Value | +-------------------------+-----------------------------------------------------------------------------+ | admin_state_up | UP | | allowed_address_pairs | | | binding_host_id | None | | binding_profile | None | | binding_vif_details | None | | binding_vif_type | None | | binding_vnic_type | normal | | created_at | 2022-12-04T20:39:42Z | | data_plane_status | None | | description | | | device_id | | | device_owner | | | device_profile | None | | dns_assignment | None | | dns_domain | None | | dns_name | None | | extra_dhcp_opts | | | fixed_ips | ip_address='10.0.100.200', subnet_id='2b25eec7-cb6c-4fa8-a06e-651ab5e13f09' | | id | f790d187-3a17-4eb6-ac68-0a93275927b0 | | ip_allocation | None | | mac_address | fa:16:3e:a8:d9:6a | | name | puerto-cliente | | network_id | 883c8952-21e8-48a1-8cf0-0418e8e592d7 | | numa_affinity_policy | None | | port_security_enabled | True | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | propagate_uplink_status | None | | qos_network_policy_id | None | | qos_policy_id | None | | resource_request | None | | revision_number | 1 | | security_group_ids | ea2781f0-7c84-46b5-873c-a4986b14f232 | | status | DOWN | | tags | | | tenant_id | 2aac00e135b84d868bd4cd6bca13cc5a | | trunk_details | None | | updated_at | 2022-12-04T20:39:42Z | +-------------------------+-----------------------------------------------------------------------------+openstack server create --flavor m1.mini \ --image "Debian 11 Bullseye" \ --key-name pass \ --port puerto-cliente \ maquina-cliente+-----------------------------+------------------------------------------------------------------+ | Field | Value | +-----------------------------+------------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | | | OS-EXT-STS:power_state | NOSTATE | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | None | | OS-SRV-USG:terminated_at | None | | accessIPv4 | | | accessIPv6 | | | addresses | | | adminPass | 24fYKvf2iM5g | | config_drive | | | created | 2022-12-04T20:40:48Z | | flavor | m1.mini (3) | | hostId | | | id | ca52b7d4-9bb9-4133-98d4-82aa8300cf40 | | image | Debian 11 Bullseye (6d992898-7e4f-44b9-a681-6dcf32d24a1f) | | key_name | pass | | name | maquina-cliente | | progress | 0 | | project_id | 2aac00e135b84d868bd4cd6bca13cc5a | | properties | | | security_groups | name='default' | | status | BUILD | | updated | 2022-12-04T20:40:48Z | | user_id | 96a8e1784a38a07b78e6b0d2ac823603b2590a618dd18748ebd450bed2a376a9 | | volumes_attached | | +-----------------------------+------------------------------------------------------------------+- ¿Podremos assignarle a esta instancia una IP flotante?¿Por qué?
- No, porque no está conectada directamente con la red externa.
- ¿Podremos assignarle a esta instancia una IP flotante?¿Por qué?
-
Ya montado todo este escenario, vamos a configurar la
máquina-routerpara que haga de router nat. Sin embargo, las restricciones y la seguridad del cortafuegos que tenemos configurado en cada una de las intrefaces de las instancias no van a permitir que funcione de forma adecuada. Por lo tanto, desactiva la seguridad de la interfaz demaquina-routerymaquina-clienteconectadas a la red-interna.--- maquina-router --- openstack server remove security group maquina-router default openstack port set --disable-port-security puerto-externo openstack port set --disable-port-security puerto-interno--- maquina-cliente --- openstack server remove security group maquina-cliente default openstack port set --disable-port-security puerto-cliente- Nos conectamos a la máquina-cliente a través de la máquina router usando
ssh -AJ
ssh -AJ debian@172.22.201.223 debian@10.0.100.200 - Nos conectamos a la máquina-cliente a través de la máquina router usando
-
Configuramos la instancia maquina-router para que funcione como router-nat. Comprueba que el cliente tiene acceso a internet. Instala un servidor web en el cliente.
-
Nos conectamos a la máquina-router y la configuramos de la siguiente manera:
---Nos conectamos--- ssh debian@172.22.200.229 -
Instalamos iptables
sudo su apt install iptables -
Configuramos el bit de forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward -
Configuramos las reglas de iptables
iptables -t nat -A POSTROUTING -s 10.0.100.0/24 -o ens3 -j SNAT --to 192.168.0.10 iptables -t nat -A PREROUTING -p tcp --dport 80 -i ens3 -j DNAT --to 10.0.100.200:80root@maquina-router:/home/debian# sudo iptables -t nat -L -n -v Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- ens3 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:10.0.100.200:80 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- * ens3 10.0.100.0/24 0.0.0.0/0 to:192.168.0.10
-
-
Comprobamos del acceso al servidor web de la maquina-cliente desde el exterior.
ssh -AJ debian@ip debian@10.0.100.200 ping -c 5 8.8.8.8
-
Instalamos apache2
apt update apt install apache2<html> <head> <title>TALLER 2</title> </head> <body> <h1>Gestión de redes en OpenStack</h1> </body> </html> -
Accedemos desde el navegador a la IP de la máquina-router
EXTRA. Comprobación de la creación de las redes.
- Listado de routers
- Listado de redes
- Listado de subredes