Una Red Privada Virtual (VPC) es el límite de red fundamental para tus recursos dentro de Amazon Web Services. Una arquitectura de VPC mal concebida es una fuente principal de deuda técnica, creando vulnerabilidades de seguridad críticas y cuellos de botella severos para la escalabilidad. Por el contrario, una VPC bien diseñada, construida sobre principios fundamentales, permite una postura "segura por defecto", simplifica las operaciones y escala sin problemas con tus cargas de trabajo.
Este artículo es una guía técnica, orientada a la implementación, para directores de tecnología (CTOs) e ingenieros senior. Pasaremos de utilizar la "VPC predeterminada" y construiremos una infraestructura de red de nivel de producción, detallando las decisiones arquitectónicas y configuraciones precisas necesarias para un despliegue seguro, escalable y en múltiples zonas de disponibilidad (AZ).
Decisión Arquitectónica Principal: Planificación de VPC y CIDR de Subredes
La decisión más crítica e irreversible es el bloque principal de Enrutamiento Interdominio Sin Clase (CIDR) de su VPC. Una vez que se ha creado una VPC, no se puede modificar su bloque CIDR principal.
Problema: Elegir una CIDR común (por ejemplo, 172.16.0.0/16 o 192.168.0.0/16) genera una alta probabilidad de conflictos de direcciones IP cuando inevitablemente necesite conectarse a una red local (a través de VPN o Direct Connect) o comunicarse con otra VPC (por ejemplo, un socio o un proveedor de SaaS).
Solución:
Utilice un bloque grande: Siempre comience con un /16 bloque. Esto proporciona 65.536 direcciones IP privadas, lo cual es más que suficiente para el crecimiento y la segmentación. Las direcciones IP son gratuitas; el agotamiento de direcciones IP es un fallo catastrófico.
Evite los bloques comunes: Seleccione un bloque del rango 10.0.0.0/8 que sea poco común. Por ejemplo, elija algo específico como 10.100.0.0/16. Esta simple decisión evitará innumerables conflictos de red en el futuro.
Servicios de Ingeniería de Productos
Colabore con nuestros gestores de proyectos, ingenieros de software y probadores de calidad para desarrollar su nuevo producto de software personalizado o para apoyar su flujo de trabajo actual, siguiendo las metodologías Agile, DevOps y Lean.
Estrategia de segmentación: El modelo Multi-AZ, Multi-Tier
Su estrategia de subred debe basarse en dos principios:Alta Disponibilidad (HA) y Aislamiento de Seguridad.
IMPORTANTE: Su aplicación debe sobrevivir al fallo de una Zona de Disponibilidad completa. Esto significa que debe tener presencia en al menos dos, preferiblemente tres, Zonas de Disponibilidad.
Aislamiento: Los recursos deben estar segmentados según su función y su postura de seguridad. La división principal es Público vs. Privado.
Subredes Públicas: Contienen recursos que deben tener una conexión directa con el Gateway de Internet (IGW). Este nivel es para Elastic Load Balancers (ELBs) y NAT Gateways orientados a Internet.
Subredes Privadas: Contienen sus recursos protegidos (servidores de aplicaciones, tareas de contenedor, bases de datos) que nunca deben ser accesibles directamente desde Internet.
Combinando estos, un modelo robusto implica la creación de subredes emparejadas para cada nivel funcional en cada zona de disponibilidad.
Ejemplo de Plan VPC:
CIDR de VPC:10.100.0.0/16
Región:us-east-1 (con zonas us-east-1a, us-east-1b, us-east-1c)
Utilizaremos bloques de /24 para nuestras subredes (con 256 direcciones IP cada una), lo cual es un tamaño común y flexible.
This HTML code represents a table with five columns and two rows. Here's a breakdown:
* **`
`**: This is the main tag that defines the HTML table.
* **``**: This tag groups the table's rows. It's good practice to use `` for semantic correctness.
* **`
`**: Each `
` tag represents a single table row.
* **`
`**: Each `
` tag represents a single table data cell within a row.
The table contains the following data:
| Column 1 | Column 2 | Column 3 | Column 4 | Column 5 |
|---|---|---|---|---|
| `Private` | Database Tier A | `us-east-1` | `10.100.32.0/24` | `Private` |
| `Private` | Database Tier C | `us-east-1c` | `10.100.32.0/24` | `Private` |
**Observations and Potential Issues:**
* **`style` attribute usage:** While the code *can* have inline styles, it's generally best practice to avoid them. Inline styles make your code harder to maintain and override. Ideally, you should use CSS classes or IDs to style the table and its elements.
* **`class` attribute is missing:** If you were to use CSS, you'd typically add `class` attributes to the `
`, `
`, and `
` elements. For example:
```html
Column 1
Column 2
Column 3
Column 4
Column 5
Private
Database Tier A
us-east-1
10.100.32.0/24
Private
Private
Database Tier C
us-east-1c
10.100.32.0/24
Private
```
Then you could use CSS like this:
```css
.my-table {
border-collapse: collapse;
}
.cell1, .cell2, .cell3, .cell4, .cell5 {
border: 1px solid black;
padding: 5px;
}
```
* **`id` attribute:** Using `id` attributes is generally only appropriate for uniquely identifying a single element on a page. If you have multiple tables on the page, using `id` attributes on each table would cause conflicts.
In summary, while the provided HTML code is structurally correct, using CSS classes and avoiding inline styles would result in more maintainable and scalable code.
Esta estructura nos proporciona una clara separación de responsabilidades, para todas las capas (HA), y un amplio espacio para futuras expansiones (por ejemplo, añadiendo las capas de private-data o private-mgmt).
Implementación: Enrutamiento, Puertos y Salida
Con el plan definido, la implementación implica la creación de los componentes de red y "conectarlos" entre sí utilizando las tablas de enrutamiento.
Paso 1: Crear VPC, subredes e Internet Gateway (IGW)
Primero, cree los componentes principales. Utilizaremos la AWS CLI para obtener resultados precisos.
# 1. Create the VPC
VPC_ID=$(aws ec2 create-vpc --cidr-block 10.100.0.0/16 \
--query 'Vpc.VpcId' --output text)
aws ec2 create-tags --resources $VPC_ID --tags Key=Name,Value=prod-vpc
# 2. Create the Internet Gateway and attach it
IGW_ID=$(aws ec2 create-internet-gateway --query 'InternetGateway.InternetGatewayId' --output text)
aws ec2 create-tags --resources $IGW_ID --tags Key=Name,Value=prod-igw
aws ec2 attach-internet-gateway --vpc-id $VPC_ID --internet-gateway-id $IGW_ID
# 3. Create public subnets (example for AZ-a)
# (Enable auto-assign public IP for convenience in this subnet)
SUBNET_PUB_A=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.100.10.0/24 \
--availability-zone us-east-1a --query 'Subnet.SubnetId' --output text)
aws ec2 modify-subnet-attribute --subnet-id $SUBNET_PUB_A --map-public-ip-on-launch
aws ec2 create-tags --resources $SUBNET_PUB_A --tags Key=Name,Value=public-a
# 4. Create private subnets (example for AZ-a)
SUBNET_APP_A=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.100.20.0/24 \
--availability-zone us-east-1a --query 'Subnet.SubnetId' --output text)
aws ec2 create-tags --resources $SUBNET_APP_A --tags Key=Name,Value=private-app-a
# ... repeat for all other subnets in our plan ...
Paso 2: Configurar el enrutamiento público frente al privado
Larutificación
Tablas de enrutamiento privadas (HA Salida): Las subredes privadas no deben tener una ruta al IGW. Para el acceso a internet (por ejemplo, para aplicar parches de software o llamar a APIs externas), deben utilizar un Gateway NAT (NGW). Para la alta disponibilidad, debemos provisionar un NGW en cada Zona de Disponibilidad (por ejemplo, en public-a, public-b, public-c). A continuación, creamos una tabla de enrutamiento privada separada para cada Zona de Disponibilidad que apunta a su NGW local. Esto evita que un fallo en un NGW específico afecte la conectividad de internet para todas las Zonas de Disponibilidad. Bash
# --- Configuration for AZ-A ---
# 1. Create Elastic IP for NGW-A
EIP_A=$(aws ec2 allocate-address --domain vpc --query 'AllocationId' --output text)
# 2. Create NGW-A in the public-a subnet
NGW_A=$(aws ec2 create-nat-gateway --subnet-id $SUBNET_PUB_A --allocation-id $EIP_A \
--query 'NatGateway.NatGatewayId' --output text)
aws ec2 create-tags --resources $NGW_A --tags Key=Name,Value=nat-gateway-a
# Wait for NGW to be available (omitted for brevity)
# 3. Create a private route table for AZ-A
RTB_PRIVATE_A=$(aws ec2 create-route-table --vpc-id $VPC_ID \
--query 'RouteTable.RouteTableId' --output text)
aws ec2 create-tags --resources $RTB_PRIVATE_A --tags Key=Name,Value=rtb-private-a
# 4. Add default route via NGW-A
aws ec2 create-route --route-table-id $RTB_PRIVATE_A \
--destination-cidr-block 0.0.0.0/0 --nat-gateway-id $NGW_A
# 5. Associate with ALL private subnets in AZ-A
aws ec2 associate-route-table --subnet-id $SUBNET_APP_A --route-table-id $RTB_PRIVATE_A
# ... associate with private-db-a ...
# --- Repeat steps 1-5 for AZ-B and AZ-C ---
# (Create EIP-B, NGW-B in public-b, RTB_PRIVATE_B, route 0.0.0.0/0 to NGW-B,
# and associate with private-app-b, private-db-b)
Tabla de enrutamiento pública: Crear una única tabla de enrutamiento para todas las subredes públicas. Su característica principal es una ruta predeterminada (0.0.0.0/0) que apunta al puerto de Internet.Bash
# Create public route table
RTB_PUBLIC=$(aws ec2 create-route-table --vpc-id $VPC_ID \
--query 'RouteTable.RouteTableId' --output text)
aws ec2 create-tags --resources $RTB_PUBLIC --tags Key=Name,Value=rtb-public
# Add the "public" route to the IGW
aws ec2 create-route --route-table-id $RTB_PUBLIC \
--destination-cidr-block 0.0.0.0/0 --gateway-id $IGW_ID
# Associate with our public subnets
aws ec2 associate-route-table --subnet-id $SUBNET_PUB_A --route-table-id $RTB_PUBLIC
# ... associate with public-b, public-c ...
En este punto, cualquier instancia de EC2 lanzada en private-app-a no tiene una dirección IP pública, no es accesible desde internet, pero puede iniciar conexiones salientes a través de nat-gateway-a.
Servicios de Ingeniería de Productos
Colabore con nuestros gestores de proyectos, ingenieros de software y testers de control de calidad para desarrollar su nuevo producto de software personalizado o para apoyar su flujo de trabajo actual, siguiendo metodologías Agile, DevOps y Lean.
Seguridad en capas: Grupos de seguridad frente a ACLs de red
Un fallo común es malinterpretar las dos capas de los firewalls de la VPC.
Grupos de seguridad (SGs)
Qué son: Un firewall de nivel de instancia y con estado.
Con estado: Si permite el tráfico entrante (por ejemplo, el puerto 443), el tráfico saliente se permite automáticamente, independientemente de las reglas salientes.
Alcance: Aplicado a una Interfaz de Red Elástica (ENI), que es efectivamente una instancia.
Reglas: Solo permitir. No se pueden crear reglas de "rechazo".
Mejor práctica: Utilice las SG como su firewall principal y granular. Una técnica clave es referenciar otras SG en sus reglas. Esto es mucho mejor que codificar bloques CIDR.
Ejemplo de Terraform (HCL): Este patrón es ideal.
resource "aws_security_group" "lb_sg" {
name = "prod-lb-sg"
vpc_id = aws_vpc.prod.id
# Allow public web traffic
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group" "app_sg" {
name = "prod-app-sg"
vpc_id = aws_vpc.prod.id
# ONLY allow traffic from our load balancer
ingress {
from_port = 8080 # App port
to_port = 8080
protocol = "tcp"
security_groups = [aws_security_group.lb_sg.id] # Source is the LB SG
}
}
resource "aws_security_group" "db_sg" {
name = "prod-db-sg"
vpc_id = aws_vpc.prod.id
# ONLY allow traffic from our application tier
ingress {
from_port = 5432 # PostgreSQL port
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.app_sg.id] # Source is the App SG
}
}
Listas de control de acceso a la red (NAC)
¿Qué son: Un firewall de nivel de subred, sin estado.
Sin estado: Si permite el tráfico entrante, debe también permitir explícitamente el tráfico saliente.
Alcance: Aplicado a una o más subredes.
Reglas: Permitir y Rechazar reglas. Las reglas se procesan por número, en orden.
Recomendación: Dejar el NACL predeterminado como "PERMITER TODO" (lo cual es por defecto). Utilice los grupos de seguridad para el 99% de sus necesidades de seguridad. Los NACLs son una herramienta tosca, que es mejor reservar para reglas explícitas de "rechazo" (por ejemplo, "rechazar todo el tráfico del rango de direcciones IP maliciosas conocido 1.2.3.0/24"). Los NACLs demasiado complejos son una causa común de pesadillas al depurar la conectividad de la red.1.2.3.0/24"). Las NACLs (Network Access Control Lists) excesivamente complejas son una causa común de problemas y frustraciones al intentar solucionar problemas de conectividad de red.
Seguridad del tráfico interno: Puntos finales de VPC
Una importante vulnerabilidad de seguridad en muchas VPCs es que la comunicación desde una subred privada hacia un servicio de AWS (como S3 o DynamoDB) atraviesa la red pública por defecto (a través del Gateway NAT). Esto es ineficiente, genera costes adicionales de transferencia de datos y aumenta tu superficie de ataque.
Solución: VPC Endpoints para mantener este tráfico en la red privada de AWS.
Puntos de acceso
Servicios: S3 y DynamoDB.
¿Cómo funcionan?: Usted crea el punto final y lo asocia con sus tablas de enrutamiento privadas. AWS añade automáticamente una ruta para el rango de IP pública del servicio al punto final.
Coste: Gratuito.
Implementación (Punto final S3):
# Create the gateway endpoint for S3
aws ec2 create-vpc-endpoint --vpc-id $VPC_ID \
--service-name com.amazonaws.us-east-1.s3 \
--route-table-ids $RTB_PRIVATE_A $RTB_PRIVATE_B $RTB_PRIVATE_C
# Best Practice: Attach a policy to restrict access
# This example policy only allows Get/PutObject to a specific bucket
# from a specific IAM role within your instances.
# (Policy JSON ommitted for brevity)
Ahora, cualquier llamada a la API S3 desde una instancia en una subred privada se enruta automáticamente y de forma transparente a través del punto final privado, no a través del Gateway NAT.
Puntos de acceso de la interfaz (AWS PrivateLink)
Servicios: La mayoría de los demás servicios de AWS (SQS, SNS, Kinesis, CodeCommit, etc.) y sus propios servicios.
Cómo funcionan: Crea una interfaz de red elástica (ENI) con una IP privada dentro de sus subredes privadas.. Accede al servicio a través de un nombre de DNS privado.
Coste: Se factura por hora y por GB de datos procesados.
Implementación: Debe especificar qué subredes privadas (una por zona de alta disponibilidad) deben pertenecer a las ENI del punto de conexión.
Utilizar endpoints es un componente esencial e indispensable en el diseño de una VPC segura.
Escalar más allá de una VPC: AWS Transit Gateway
A medida que su organización crece, tendrá múltiples VPCs (por ejemplo, producción, desarrollo, servicios compartidos, ciencia de datos). La solución tradicional, VPC Peering, crea una red compleja y no transitiva de N a N que es difícil de gestionar.
Solución: AWS Transit Gateway (TGW).
Servicios de Ingeniería de Productos
Trabaje con nuestros gestores de proyectos, ingenieros de software y probadores de calidad internos para desarrollar su nuevo producto de software personalizado o para apoyar su flujo de trabajo actual, siguiendo metodologías Agile, DevOps y Lean.
El TGW actúa como un enrutador central en la nube en un modelo de "hub and spoke".
Usted crea un TGW.
Todas sus redes VPC (los "centros") se conectan a este TGW (el "hub").
Su red local (a través de VPN/Direct Connect) también se conecta al TGW.
Este modelo simplifica enormemente la gestión de rutas:
Cada VPC solo necesita una ruta (p. ej., 10.0.0.0/810.0.0.0/8
) que apunte al nodo de conexión.
Permite un modelo de "inspección centralizada", donde todo el tráfico puede ser dirigido a través de una VPC dedicada ("seguridad") con firewalls de terceros antes de llegar a su destino.
Para cualquier arquitectura que se espere que crezca más allá de dos o tres VPCs, comience con un Transit Gateway. No construya una red punto a punto que tendrá que refactorizar.
Conclusión
Una red privada virtual (VPC) de nivel de producción no es un componente que se "configura y olvida". Es un diseño vivo que debe basarse en decisiones arquitectónicas intencionales. Al centrarse en un plan CIDR lógico, una estrategia de subredes multi-AZ, enrutamiento consciente de la alta disponibilidad (HA) y seguridad en capas a través de grupos de seguridad (SGs) y puntos finales de VPC, se crea una base que permite, en lugar de obstaculizar, la seguridad y el crecimiento de su aplicación.
Construir esta base correctamente es una competencia fundamental de los servicios de ingeniería en la nube.Ya sea que sus equipos remotos estén creando nuevas plataformas o migrando las existentes, dominar este nivel de red es un requisito previo para el éxito en AWS.Estamos creando nuevas plataformas o migrando las existentes, y dominar esta capa de red es un requisito fundamental para tener éxito en AWS.
Preguntas frecuentes
¿Cuál es la estrategia óptima para elegir un bloque CIDR de VPC para evitar futuros conflictos de red?
La elección de un bloque CIDR de VPC es una decisión fundamental e irreversible. Para garantizar la escalabilidad a largo plazo, siempre provisione un bloque /16, que proporciona más de 65,000 direcciones IP. Crucialmente, debe evitar los rangos predeterminados comunes (como 192.168.0.0/16) que a menudo causan conflictos de IP al conectarse a redes locales o realizar peering con otras VPCs. En su lugar, seleccione un rango diferente (por ejemplo, 10.100.0.0/16) para facilitar una integración y un crecimiento sin problemas.
¿Cómo puedo diseñar una arquitectura de VPC de AWS para garantizar la Alta Disponibilidad (HA)?
Un diseño de VPC robusto debe poder resistir el fallo de un centro de datos completo. Esto se logra a través de una estrategia de Multi-Zona de Disponibilidad (Multi-AZ), donde se despliegan los recursos en al menos dos o tres zonas físicas separadas. Para una verdadera tolerancia a fallos, cree subredes públicas y privadas emparejadas en cada zona y asegúrese de que cada subred privada dependa de un NAT Gatewaydedicado dentro de su propia zona. Esto evita que un fallo en un solo gateway interrumpa la conectividad de salida para toda su aplicación.
¿Cuáles son los métodos más efectivos para proteger los recursos privados dentro de una VPC?
La seguridad en una VPC se basa en el aislamiento estricto y en defensas en capas. Primero, asegúrese de que los recursos sensibles (como las bases de datos y los servidores de aplicaciones) estén desplegados en subredes privadas que carezcan de conexiones directas con Internet. En segundo lugar, utilice Security Groups como firewalls a nivel de instancia y para permitir explícitamente el tráfico solo de fuentes de confianza (por ejemplo, el balanceador de carga) en lugar de rangos de IP abiertos. Finalmente, implemente VPC Endpoints para enrutar el tráfico a servicios de AWS como S3 y DynamoDB internamente, manteniendo sus datos fuera de la red pública y reduciendo su superficie de ataque.