Bienvenidos a la segunda parte de nuestro laboratorio sobre redes y VPC en AWS! si no haz realizado la primera parte te comparto el siguiente link para que te pongas al dia workshop parte 1En esta sección, instalaremos componentes de red, lanzaremos recursos y configuraremos la comunicación tanto interna como externa hacia Internet, lo que nos llevará a construir la siguiente arquitectura
Hasta el momento, hemos creado una VPC y dos subredes: una pública y otra privada. A continuación, puedes ver su configuración en el siguiente diagrama.
Habilitar asignación de IP publica a los recursos en nuestras subredes.
En una VPC personalizada, los recursos lanzados en nuestras subredes no reciben direcciones IP públicas de forma predeterminada, a diferencia de la VPC por defecto de AWS. Para permitir que nuestros recursos se comuniquen con internet, debemos habilitar manualmente la asignación de IPs públicas, ya sea desde la configuración de subredes o al lanzar cada recurso. En este workshop, lo configuraremos directamente en la sección de subredes para la subred publica.
Ir a VPC, Subredes
Seleccionar la subred, en este caso la subred publica
En el botón de acciones seleccionar: Editar configuración de red.
- Seleccionar la casilla: Habilitar la asignación automática de la dirección IPv4 pública
Recuerda que la asignación de IP también se puede habilitar al momento de lanzar cada recurso de manera independiente por si no quieres asignarle IP de manera automática a todos.
Lanzar instancia EC2 en subred publica
En este apartado no entraremos en detalles, solo te dejare los pasos ya que hemos creado instancias en otros laboratorios. Si nunca has lanzado una instancia EC2, te recomiendo revisar este post con instrucciones paso a paso: Lanzamiento de instancia EC2
Pasos:
Ir a EC2 y seleccionar "Lanzamiento de nueva instancia"
Asigna un nombre
Elige una AMI, Amazon linux estaría perfecto
Tipo de instancia: t2.micro es suficiente
Crea un par de claves SSH (Detalles en el post recomendado sobre EC2)
En configuraciones de red presiona "editar" y no olvides seleccionar la VPC creada en este laboratorio y la subred publica
En el mismo apartado crea un grupo de seguridad que permita regla de entrada SSH y HTTP. (Colócale un nombre descriptivo)
Finalmente, selecciona lanzar instancia
Podemos conectarnos a nuestra instancia?
Aunque nuestra instancia tiene una dirección IP pública, eso no garantiza la comunicación con Internet. Vamos a intentar conectarnos usando Instance Connect para comprobarlo y explicar por qué no funciona aún.
- Selecciona tu instancia y dale conectar
- En el siguiente apartado puedes dejar todo por defecto y darle a la opción conectar, lo que arroja el siguiente resultado:
"No se puede conectar a la instancia, asegúrese de establecer una configuración de red correcta para su instancia"
Aquí nace un nuevo concepto "Gateway de internet", necesitamos una gateway de internet para que nuestros recursos puedan acceder o ser accedidos desde internet.
Que es una Gateway de internet:
Una Internet Gateway es un componente en Amazon VPC que permite la comunicación entre los recursos en una subred pública y el Internet. Actúa como un punto de entrada y salida para el tráfico, permitiendo que las instancias con direcciones IP públicas envíen y reciban datos desde Internet. La Internet Gateway es esencial para que los recursos en la nube sean accesibles globalmente, y se utiliza en conjunto con tablas de rutas para dirigir el tráfico adecuadamente.
Creación de una Gateway de Internet.
Ir al servicio de VPC
En columna izquierda ubica la opción "Puertas de enlace de internet" o "Internet Gateways"
Veras que ya existe una, esta es la que tiene adjunta la VPC por defecto de AWS, nosotros crearemos la nuestra.
Selecciona: Crea Gateway de internet y lo único que debes hacer por el momento es asignarle un nombre yo le coloque "IGW-vpclab".
Es necesario adjuntar la IGW creada con nuestra vpc-lab creada para este workshop, simplemente la seleccionamos y en el botón de "acciones" elegimos "conectar a la VPC".
- Selecciona la vpc creada en mi caso "vpc-lab" y presionas el botón conectar gateway de internet.
Con esto, ya tenemos nuestra IGW adjunta a la VPC creada para este laboratorio.
Ahora nos preguntamos: ¿pueden nuestros recursos acceder y ser accedidos desde Internet? vayamos a EC2 seleccionando nuestra instancia e intentemos conectar nuevamente:
La respuesta es no. Esto nos brinda una nueva oportunidad para explorar un componente importante en la configuración de redes: las "Tablas de enrutamiento".
Tabla de enrutamiento
Las tablas de enrutamiento en AWS controlan cómo se dirige el tráfico dentro de una VPC y hacia redes externas. Contienen reglas (rutas) que especifican a dónde enviar el tráfico según la dirección IP de destino, permitiendo, por ejemplo, la comunicación entre subredes, el acceso a Internet a través de una Internet Gateway o una conexión controlada mediante un NAT Gateway.
Con esto en mente, crearemos una tabla de enrutamiento y añadiremos una ruta que apunte a nuestra Internet Gateway para habilitar la comunicación con Internet.
Crear tabla de enrutamiento
En servicio de VPC columna izquierda seleccionamos "Tablas de enrutamiento", veras algunas predeterminadas pero crearemos nuestras propias tablas.
Seleccionar crear tabla de enrutamiento
Asigna un nombre; en este workshop, yo usare "public-route-table" ya que estará asociada a la subred pública en la que estamos trabajando.
Selecciona tu VPC que creaste para este workshop
Haz clic en "Crear tabla de enrutamiento"
Con estos pasos ya tendrás tu tabla de enrutamiento en tu VPC.
El siguiente paso es asociar la tabla que hemos creado a nuestra subred publica:
- Con tu nueva tabla de enrutamiento en la VPC, selecciona la tabla y dirígete a la sección "Asociaciones de subredes" seguido de "Editar asociaciones" en la parte inferior de la pantalla.
- En este apartado debes seleccionar la subred publica y darle "Guardar asociaciones".
Con esto, tu tabla de enrutamiento queda asociada a la subred pública, permitiendo el tráfico en esa subred según las reglas o rutas que se establezcan.
Creación de rutas
Las rutas en una tabla de enrutamiento son reglas que definen cómo se dirige el tráfico de red según su destino.
Por ejemplo:
La ruta con destino "local" utiliza el rango CIDR definido para nuestra VPC (en este caso, 10.0.0.0/24). Esta regla permite que el tráfico dentro del rango de IPs de la VPC se mantenga en la red interna sin salir a internet.
Por otro lado, si agregamos una ruta con destino 0.0.0.0/0 apuntando a nuestra Internet Gateway, estamos indicando que cualquier tráfico hacia una dirección externa a la VPC debe salir a internet, permitiendo que los recursos en la subred se comuniquen con redes externas.
Para agregar rutas a nuestras tablas:
- Selecciona la tabla de enrutamiento. En la sección inferior, ve a la opción "rutas" y selecciona "editar rutas".
Allí verás la ruta por defecto de la que hablábamos anteriormente. Ahora, agregaremos una nueva ruta:
Usa el destino 0.0.0.0/0 y selecciona "Puerta de enlace de internet" donde te aparecerán las que tienes disponibles y debes elegir la Internet Gateway creada en este laboratorio como el recurso al cual redirigir el tráfico. Así, el tráfico hacia cualquier destino externo a la VPC podrá dirigirse a internet a través de esta gateway de internet.
Guarda los cambios y nuestra ruta será agregada.
Nota: En esta misma sección, puedes elegir redirigir el tráfico hacia otros componentes, como un NAT Gateway o una conexión VPN, según los requisitos de red que tengas.
Prueba de conexión a internet
Ya hemos configurado todos los componentes necesarios para que nuestra instancia y cualquier otro recurso en la subred pública puedan comunicarse con internet. Ahora, pongamos esto a prueba
Vayamos otra vez a EC2
Selecciona la instancia
Presiona el botón conectar dejando la configuración por defecto para usar intance connect.
Y es así como obtenemos el resultado esperado:
Es aquí donde usamos la típica frase de película: "Estamos dentro".
Además, podemos realizar un ping a un sitio como google.com para verificar que la instancia no solo es accesible desde internet, sino que también nuestros recursos pueden acceder a internet, confirmando así la conectividad.
Ahora que nuestra subred pública está configurada correctamente y sus recursos pueden comunicarse con internet, enfrentamos un nuevo desafío: entender cómo nuestros recursos en la subred privada pueden acceder a internet utilizando una NAT Gateway. También exploraremos cómo pueden comunicarse con otros recursos dentro de la misma VPC, como un host bastion. ¡Esto suena interesante!
Recursos de subred privada
Es hora de comenzar a desplegar y configurar recursos y componentes en la subred privada y comenzaremos con una instancia EC2.
Instancia EC2 en subred privada
Al igual que en el lanzamiento de la primera instancia, no profundizaremos en detalles aquí. Sin embargo, te dejo el paso a paso para crear una instancia en la subred privada y el mismo enlace a un post que explica cómo configurarla y conectarte a ella.
Paso a paso:
Ir a EC2 y seleccionar "Lanzamiento de nueva instancia"
Asigna un nombre (instance-private) en mi caso.
Elige una AMI, Amazon linux estaría perfecto
Tipo de instancia: t2.micro es suficiente
Crea un par de claves SSH, un paso importante para conectarte. (Consulta el post recomendado para aprender a crear claves SSH si no estás familiarizado).
En Configuraciones de red, expande la configuración presionando "Editar" y elige la VPC creada para este laboratorio y la subred privada donde queremos que esté la instancia.
En el mismo apartado crea un grupo de seguridad que permita reglas de entrada SSH y HTTP, por el momento puede ser desde cualquier origen. (No olvides colocarle un nombre descriptivo)
Finalmente, selecciona lanzar instancia
En este punto ya tenemos nuestras dos instancias, cada una en su propia subred.
Lo siguiente que haremos será aprender cómo lograr que estas dos instancias se comuniquen entre sí de manera segura.
Comunicación entre instancias en subred publica y privada
Recordemos que para nuestra subred publica creamos una tabla de rutas, haremos lo mismo para la subred privada.
Crea la tabla y, una vez lista, asóciala a la subred privada, tal como aprendiste en los pasos anteriores. ¡Pon a prueba tus habilidades!, si no recuerdas puedes mirar como lo hicimos para la subred publica.
En este punto ya tenemos también nuestra tabla de enrutamiento para la subred privada.
- Exploremos nuestra tabla adjunta a la subred privada, simplemente selecciónala y ve a la sección inferior al apartado de rutas
Hasta ahora, en la tabla de enrutamiento asociada a la subred privada solo existe una ruta predeterminada denominada "local". Esta ruta indica que cualquier tráfico cuyo destino esté dentro del rango CIDR de nuestra VPC (en este caso, 10.0.0.0/24) debe permanecer dentro de la misma VPC. Esto permite que los recursos dentro de la VPC se comuniquen entre sí sin necesidad de salir hacia internet.
Si intentas conectarte directamente a la instancia en la subred privada mediante Instance Connect o usando SSH desde tu CLI, no podrás hacerlo, ya que esta subred no tiene acceso directo desde internet. Sin embargo, puedes conectarte a la instancia en la subred pública y, desde allí, acceder a la instancia en la subred privada.
Aquí es donde entra en juego el concepto de Host Bastion.
Que es un host bastion?
Un Host Bastion es un servidor en este caso una EC2 en una subred pública que permite el acceso seguro a otras instancias en subredes privadas de la misma VPC. Como el Host Bastion tiene acceso a internet y está en la misma red que las instancias privadas, puedes conectarte primero a él y desde allí acceder a través de SSH a las instancias que hacen parte de una subred privada en la misma VPC. Esto ofrece una capa de seguridad adicional ya que evita exponer las instancias privadas directamente a internet.
Para este workshop, utilizaremos nuestra instancia en la subred pública como un Host Bastion para conectarnos a la instancia ubicada en la subred privada.
Conexión a la instancia en la subred publica
Conéctate a la instancia en la subred pública usando Instance Connect, como hemos venido haciendo. Una vez conectado a esta instancia, utilizaremos claves SSH para conectarnos a la instancia en la subred privada. Este proceso te permitirá practicar el uso de claves SSH sin necesidad de repetir el mismo procedimiento para ambas instancias.
Solo debes seleccionar la instancia publica y darle "conectar"
- En el siguiente paso deja todo como predeterminado y vuelve a presionar "conectar"
Ya estando dentro de nuestra instancia en la subred pública. Ahora, desde aquí, conectémonos a la instancia en la subred privada. ¿Qué necesitamos para esto? Las claves SSH que generamos específicamente para esa instancia al momento de crearla.
Abre el archivo .pem que se descargó en tu computadora cuando creaste la clave SSH y copia su contenido.
Luego, usa el editor nano para crear un archivo en la instancia pública y pegar el contenido copiado. Esto nos permitirá tener la clave privada disponible en esta instancia.
sudo nano key-private.pem
Recuerda usar el nombre específico que le diste a tu clave.
- Una vez abierto el editor en la linea de comandos, pega el contenido copiado y guarda el archivo.
Quedaria algo asi:
Recuerda que este ejemplo es con fines didácticos. Nunca compartas tu llave privada con nadie. En temas avanzados de seguridad en la nube, veremos alternativas más seguras para manejar las claves de acceso.
- Para confirmar que la clave se guardó correctamente, puedes ejecutar:
cat key-private.pem
Ahora que la clave está configurada, estamos listos para conectarnos a la instancia en la subred privada desde nuestra instancia en la subred pública.
Conexión a la instancia en la subred privada
- Desde la consola en el servicio de EC2 vamos a copiar la ip privada de nuestra instancia en la subred privada
- Volvemos a la linea de comandos de nuestra instancia publica y ejecutamos el siguiente comando:
ssh -i key-private.pem ec2-user@10.0.0.239
Asegúrate de usar el nombre de tus llaves y la dirección ip privada de tu instancia.
Nota: Si al ejecutar el comando de conexión ves un mensaje de advertencia sobre la seguridad de la clave, es porque esta suele guardarse con permisos amplios para el usuario, grupo y otros. Sin embargo, solo el usuario necesita permisos de lectura para esta clave.
Para ajustar los permisos y resolver la advertencia, ejecuta el siguiente comando:
sudo chmod 400 key-private.pem
Este comando restringe los permisos para que solo el usuario tenga acceso de lectura. Luego, puedes ejecutar nuevamente el comando de conexión para ingresar sin problemas.
Que pasaría si intentamos hacer ping a un sitio como google.com desde la instancia privada?
No recibiremos respuestas satisfactoria ya que de momento esta instancia privada no puede comunicarse con internet pero aprenderemos como hacerlo.
Antes de continuar, es importante mencionar que hay formas más seguras de permitir el acceso. Para reforzar el concepto de bastion host, puedes configurar el grupo de seguridad de la instancia privada para que solo permita tráfico SSH desde recursos específicos. Esto puede lograrse permitiendo acceso únicamente desde un grupo de seguridad específico, una IP concreta o un rango CIDR determinado.
Revisando reglas del grupos de seguridad de la instancia privada
Si vamos al servicio EC2 y ubicamos en la columna izquierda el apartado de grupos de seguridad veremos los dos grupos que hemos para nuestras instancias en mi caso public-sg y private-sg
Exploremos el grupo de seguridad de la instancia privada
Actualmente, el grupo de seguridad permite tráfico SSH desde cualquier origen. Sin embargo, en un entorno real, solo necesitamos que un bastion host o un grupo de recursos específico tenga acceso a nuestra instancia privada. Para lograr esto, podemos establecer como origen solo los recursos que tengan asignado un grupo de seguridad específico; en nuestro caso, el grupo de seguridad de la instancia pública. Vamos a editar esta regla para reforzar la seguridad.
Seleccionar editar reglas de entrada
Elimina la regla SSH para volver a crearla
En el campo Origen, haz clic y verás diferentes opciones, como bloques CIDR, prefijos y grupos de seguridad. Selecciona el grupo de seguridad que tiene asignada la instancia pública.
Seleccionas guardar.
Ahora para la regla de entrada SSH el origen permitido seran todos los recursos que tenga el grupo de seguridad "sg-public" que en mi caso es el que tiene la instancia publica.
De esta manera, estamos limitando el acceso a la instancia privada únicamente desde el bastion host.
Ahora sí, habilitemos la comunicación de nuestra instancia privada con internet. ¿Cómo es esto posible? Aquí entra en juego un nuevo concepto: NAT Gateway.
Que es una NAT Gateway
Una NAT (Network Address Translation) Gateway es un servicio que permite a las instancias en una subred privada enviar solicitudes a internet, mientras mantiene su dirección IP privada. Al actuar como intermediaria, la NAT Gateway recibe las solicitudes de salida de la subred privada y las traduce a una IP pública. Esto permite que las instancias accedan a internet de forma segura, sin ser accesibles desde fuera de la red.
Creación de una NAT Gateway
- Vamos al servicio de VPC, ubicamos NAT Gateway en la columna izquierda
Crear NAT Gateway
Asignamos un nombre, en mi caso le coloque my-nat
Debemos elegir nuestra subred publica (Indispensable)
Debemos elegir la subred pública para la NAT Gateway. Esto es indispensable, ya que una NAT Gateway necesita acceso a internet mediante la Internet Gateway de la VPC para funcionar. Así, el tráfico saliente de las instancias en la subred privada se dirige primero a la NAT Gateway, donde su dirección IP privada se traduce a una IP pública para acceder a internet. Al recibir la respuesta, la NAT Gateway invierte el proceso, reemplazando la IP pública con la IP privada original antes de enviar el tráfico de regreso a la subred privada.
- Asigna una dirección IP elástica, simplemente pulsando el botón que dice "Asignar IP elástica"
Pero que es una dirección IP elástica y porque es necesaria?
Una dirección IP elástica (Elastic IP o EIP) es una dirección IP pública y estática que AWS asigna a una cuenta, y que puedes reasignar entre distintas instancias o recursos dentro de una región. A diferencia de una dirección IP pública común, que puede cambiar si detienes y reinicias una instancia, una EIP permanece constante hasta que tú decidas liberarla.
Para una NAT Gateway, una EIP es esencial porque garantiza que las solicitudes salientes desde la subred privada mantengan una IP pública fija, facilitando la comunicación con servicios externos y permitiendo que las respuestas regresen correctamente a la NAT Gateway.
- Por ultimo selecciona "Crear gateway NAT"
- Ahora, vamos a la tabla de enrutamiento de la subred privada y creamos una ruta hacia la NAT Gateway
Agregamos una ruta para que el tráfico destinado a cualquier dirección (0.0.0.0/0) desde nuestra subred privada se dirija a la NAT Gateway. Simplemente seleccionamos la opción "Puerta de enlace NAT" y aparecerá la NAT que creamos.
Finalmente, presiona "Guardar cambios".
Con la ruta configurada hacia la NAT Gateway, ahora podemos hacer un ping a google.com desde nuestra instancia en la subred privada para verificar que la conectividad a Internet está funcionando correctamente.
Ahora si estamos recibiendo respuesta a nuestras solicitudes hacia internet.
Algunas aclaraciones:
Ruta implícita de la NAT Gateway: La NAT Gateway ya tiene una ruta implícita hacia la Internet Gateway, por lo que no es necesario crear una ruta adicional desde la NAT hacia la Internet Gateway.
Restricción del tráfico de entrada: El tráfico de entrada no puede llegar directamente desde Internet hacia la NAT Gateway. Esta solo maneja respuestas a solicitudes salientes, asegurando que solo el tráfico iniciado desde la subred privada pueda recibir respuestas.
Si vemos un diagrama mas detallado seria algo asi:
Resumen
Espero que hayan aprendido mucho sobre estos conceptos. Aunque algunos temas se desvían del objetivo principal, el propósito es que comprendan el "porqué" de cada acción y no pasen por alto conceptos importantes.
Creamos una Internet Gateway.
Configuramos tablas de enrutamiento y agregamos rutas.
Establecimos un Host Bastion.
Conectamos nuestras instancias mediante SSH.
Establecimos comunicación entre nuestros recursos
Configuramos una NAT Gateway con una IP elástica.
Realizamos peticiones a Internet desde nuestra instancia privada y recibimos respuestas satisfactorias.
Profundizamos en conceptos clave relacionados con redes y seguridad
Espero que les haya gustado. Como siempre, les invito a interactuar con el contenido, compartirlo y comentarme si aprendieron algo nuevo o si tienen alguna duda.