> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Subredes

> Esculpir una VPC en rangos: qué significa realmente público, qué direcciones no se obtienen y qué bloquea una eliminación.

<Tabs>
  <Tab title="Console">
    Vaya a **Networking → Subnets** y elija **Create Subnet**. En **Subnet details**, seleccione el **VPC**, luego rellene **Name** y **CIDR**. **Gateway IP** es opcional y predeterminada para usted.

    Bajo **Routing**, **Route Table** Este es el único campo que vale la pena decidir aquí en lugar de más tarde — vea la sección sobre el campo de nombres de servidores.
    [Los enrutadores públicos y privados](#public-and-private-are-routing-not-a-flag).
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    POST /v1/subnets
    {
      "vpc": "5f8d3a2e-1c4b-4e7a-9f6d-2b1a8c3e5d7f",
      "name": "prod-web",
      "cidr_ipv4": "10.0.1.0/24"
    }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic network subnet create --vpc <vpc-id> \
      --name prod-web --cidr-ipv4 10.0.1.0/24
    ```

    Añadir `--cidr-ipv6` para una subred de doble pila, y `--route-table` para aterrizar en algún lugar que no sea la tabla predeterminada.
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    sub, err := network.New(cfg).CreateSubnet(ctx, &network.SubnetCreateRequest{
        VPC: vpcID,
        Name:  "prod-web",
        CIDRIPv4:  "10.0.1.0/24",
    })
    ```
  </Tab>
</Tabs>

La entrada `vpc` acepta un UUID, CRN o nombre exacto de ámbito de cuenta. La opción `route_table` acepta un UUID, un CRN anidado o un nombre dentro de esa VPC; si se omite, se selecciona la tabla predeterminada, llamada `<vpc-name>-private-rt`. Una referencia vacía no es válida. Un CRN de subred incluye su elemento principal: `crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/public`.

Las listas aceptan filtros exactos `name` y `crn`. Filtrar subredes por nombre también requiere `vpc`; filtrar interfaces por nombre requiere `subnet`. Los filtros se combinan, y una búsqueda fallida nunca intenta una interpretación diferente de la referencia.

<a id="reading-placement" />

## Colocación de lectura

Las respuestas de subred incluyen la VPC principal completa en `vpc` y un resumen de `route_table` que contiene `id`, `crn` y `name`. Use `vpc.id` y `vpc.name` para la colocación, y `route_table.id` y `route_table.name` para los enlaces de enrutamiento; no es necesario leer por separado solo para mostrar esos nombres. Estos incrustados reemplazan los antiguos campos de respuesta `vpc_id` y `route_table_id`.

`route_table` puede ser nulo cuando su búsqueda ya no se resuelve, como durante la reasociación y eliminación simultánea de la tabla anterior. Trate esto como una ubicación no disponible: actualice antes de actuar sobre la asociación. No significa que la subred sea privada o que use la tabla predeterminada. La relación VPC es obligatoria.

Las solicitudes todavía utilizan referencias de cadena. Para reutilizar una relación incrustada en una solicitud de creación o actualización, pase su `id` (o un CRN/nombre compatible), no el objeto incrustado. En Go, comprueba el resumen nullable antes de leer su ID:

```go theme={null}
if sub.RouteTable != nil {
    fmt.Println(sub.RouteTable.ID, sub.RouteTable.Name)
}
```

El CIDR debe estar completamente dentro del CIDR de la VPC principal de la misma familia y no debe superponerse a otra subred de la misma VPC. `name` es único por VPC.

`gateway_ipv4` por defecto es la primera dirección después de la dirección de red (`10.0.1.1` en un `10.0.1.0/24`). Puedes suministrar tu propio, siempre y cuando esté dentro del CIDR.

`cidr_ipv4` y `gateway_ipv4` son inmutables. `description`, `tags` y `route_table` no lo son.

<a id="public-and-private-are-routing-not-a-flag" />

## Los públicos y privados están enrutados, no un indicador

No hay un booleano `public` en una subred. Una subred es pública cuando la tabla de rutas que utiliza tiene una ruta `0.0.0.0/0` que apunta a una puerta de enlace de Internet, y privada de lo contrario. La `route_table.id` de la subred identifica esa tabla, por lo que mover una subred entre las dos posiciones es un `PATCH` que la re-asocia con una tabla diferente:

<Tabs>
  <Tab title="Console">
    Abre la pestaña **Settings** de la subred. En **Routing**, seleccione una tabla y seleccione **Change route table**. Actualizar si la asociación actual no está disponible.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    PATCH /v1/subnets/{subnet_id}
    { "route_table": "a3c9e1f4-7b2d-4a6e-8c1f-9d3b5e7a2c4f" }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic network subnet update <subnet-id> --route-table private
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    sub, err := network.New(cfg).UpdateSubnet(ctx, subnetID, &network.SubnetUpdateRequest{
        RouteTable: basaltic.String("private"),
    })
    ```
  </Tab>
</Tabs>

<Warning>
  Mover una subred cambia la postura de **todas las instancias que ya se ejecutan en ella**, de inmediato, no solo las creadas posteriormente. Mover una subred a una tabla con una ruta predeterminada a una puerta de enlace de Internet es lo que la hace pública; moverla fuera es lo que la quita.
</Warning>

Todo lo que se refiere a las rutas que existen vive en la página [routing](/es/networking/routing).

<a id="which-addresses-you-actually-get" />

## Qué direcciones recibes realmente

Tres direcciones en una subred IPv4 no están disponibles: la dirección de red, la dirección de difusión y la puerta de enlace. Un `/24` deja 253 utilizable — nada se retiene para DNS o metadatos de instancia, porque el punto final de metadatos es el enlace local `169.254.169.254` en lugar de una dirección dentro de su subred.

La asignación automática toma la dirección libre más baja por encima de la puerta de enlace. Si usted proporciona una `address` IPv4 en la solicitud de `addresses` de una interfaz, se comprueba contra todo: dentro del CIDR, no la red o la dirección de difusión, y no ya ocupada — ya sea por otra interfaz o por otro recurso, como el VIP de un balanceador de carga.

<a id="dual-stack-subnets" />

## Subredes de doble pila

La VPC debe tener un prefijo IPv6. Cada subred de pila doble utiliza un `/64`; un `/60` público proporciona dieciséis, mientras que las asignaciones de ULA privadas más grandes proporcionan más.

<Tabs>
  <Tab title="Console">
    En **Create Subnet**, seleccione una VPC con IPv6. En **IPv6**, elija **Automatic IPv6 /64** para asignar un prefijo libre. El formulario comienza en **IPv4 only**. Para elegir un prefijo específico, seleccione **Manual IPv6 /64** e introduzca **IPv6 CIDR**.

    IPv6 está deshabilitado cuando la VPC seleccionada no tiene un prefijo IPv6. Al cambiar la VPC o la región, se borra la selección de IPv6.
  </Tab>

  <Tab title="API">
    Solicitar asignación automática sin nombrar un prefijo:

    ```bash theme={null}
    POST /v1/subnets
    {
      "vpc": "5f8d3a2e-1c4b-4e7a-9f6d-2b1a8c3e5d7f",
      "name": "prod-web",
      "cidr_ipv4": "10.0.1.0/24",
      "allocate_cidr_ipv6": true
    }
    ```

    Para elegir un `/64` específico, reemplaza `"allocate_cidr_ipv6": true` con `"cidr_ipv6": "2a13:9500:1a6:100::/64"`, usando un prefijo libre dentro de `cidr_ipv6` de tu VPC. No envíe ambas. Omita ambos para una subred solo IPv4.
  </Tab>

  <Tab title="CLI">
    Nombre un `/64` libre dentro de su VPC:

    ```bash theme={null}
    basaltic network subnet create --vpc <vpc-id> \
      --name prod-web --cidr-ipv4 10.0.1.0/24 --cidr-ipv6 2a13:9500:1a6:100::/64
    ```

    Para la asignación automática, reemplace `--cidr-ipv6` y su valor con `--allocate-cidr-ipv6`.
  </Tab>

  <Tab title="Go">
    Nombre un `/64` libre dentro de su VPC:

    ```go theme={null}
    cidrV6 := "2a13:9500:1a6:100::/64"
    sub, err := network.New(cfg).CreateSubnet(ctx, &network.SubnetCreateRequest{
        VPC:  vpcID,
        Name:   "prod-web",
        CIDRIPv4:   "10.0.1.0/24",
        CIDRIPv6: &cidrV6,
    })
    ```

    Para la asignación automática, reemplace `CIDRIPv6` con `AllocateCIDRIPv6: basaltic.Bool(true)`.
  </Tab>
</Tabs>

La asignación automática selecciona el menor `/64` libre, incluyendo los prefijos liberados al eliminar una subred. Los prefijos explícitos deben ser `/64`s dentro de la VPC y no pueden superponerse a otra subred. La puerta de enlace IPv6 es la dirección `::1` del prefijo.

Cuando todos los prefijos disponibles están ocupados, la creación devuelve HTTP `409` con “VPC no tiene IPv6 /64s libres”. Elimine una subred no utilizada o utilice otra VPC. Un `409` que menciona una disputa de asignación significa que las solicitudes concurrentes reclamaron prefijos durante la creación; vuelva a intentar la solicitud.

<a id="enabling-ipv6-later" />

### Habilitar IPv6 más tarde

La VPC ya debe tener IPv6. Una vez que se establece un prefijo de subred, no se puede reemplazar ni eliminar. Al habilitarlo, se agrega IPv6 a cada interfaz existente mientras se conservan las direcciones IPv4. Una puerta de enlace NAT alojada en esa subred también recibe su dirección IPv6 pública, incluso si no cambia el enrutamiento.

<Tabs>
  <Tab title="Console">
    Abra la subred y elija **Enable IPv6**. Deje **IPv6 CIDR (optional)** en blanco para la asignación automática. **Copy matching IPv4 security rules** está seleccionado de forma predeterminada. En **IPv6 internet routing**, mantenga **Match IPv4
    routing** o elija la puerta de enlace requerida o **Leave routing unchanged**. Confirme con **Enable IPv6**.
  </Tab>

  <Tab title="API">
    ```http theme={null}
    PATCH /v1/subnets/{subnet_id}
    ```

    ```json theme={null}
    {
      "allocate_cidr_ipv6": true,
      "copy_ipv4_security_rules": true,
      "ipv6_routing": "match_ipv4"
    }
    ```

    Reemplazar `allocate_cidr_ipv6` con `cidr_ipv6` para elegir un `/64` específico.
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic network subnet update <subnet-id> \
      --allocate-cidr-ipv6 --ipv6-routing match_ipv4
    ```

    Añadir `--copy-ipv4-security-rules=false` para mantener las reglas de grupo de seguridad sin cambios.
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    subnet, err := network.New(cfg).UpdateSubnet(ctx, subnetID, &network.SubnetUpdateRequest{
        AllocateCIDRIPv6:      basaltic.Bool(true),
        CopyIPv4SecurityRules: basaltic.Bool(true),
        IPv6Routing:          basaltic.String("match_ipv4"),
    })
    ```
  </Tab>
</Tabs>

La copia de reglas preserva el protocolo, los puertos y la dirección. Copia `0.0.0.0/0` a `::/0` y copia las referencias de los grupos de seguridad. Los CIDR IPv4 restringidos no tienen equivalente IPv6 automático y permanecen sin cambios. Las reglas IPv6 equivalentes existentes no se duplican. Los cambios afectan a todas las interfaces que comparten esos grupos.

`match_ipv4` añade `::/0` a través de la misma puerta de enlace de Internet o NAT que la ruta predeterminada IPv4. Sin una ruta predeterminada IPv4, IPv6 permanece aislado. Las rutas predeterminadas IPv6 existentes siempre se conservan. También puede seleccionar `internet_gateway`, `nat_gateway`, `egress_only_gateway`, o `unchanged`. Una ruta NAT IPv6 requiere IPv6 en la subred de alojamiento de la puerta de enlace NAT primero. Las puertas de enlace de solo salida proporcionan salida GUA nativa; el acceso a Internet ULA necesita NAT. Los cambios de ruta afectan a todas las subredes que comparten la tabla.

El programa de instalación comprueba los permisos y las cuotas antes de confirmar los cambios. Copiar reglas requiere `network:CreateSecurityGroupRule`; agregar rutas requiere `network:CreateRoute`; crear una puerta de enlace de salida solo requiere `network:CreateEgressOnlyGateway`. La actualización de una puerta de enlace NAT hospedada requiere `network:UpdateNATGateway` y una cuota IPv6 pública disponible.

`cidr_ipv6` en la respuesta es cómo un cliente distingue los dos: es nulo en una subred solo v4 y se establece en una de doble pila, junto con `gateway_ipv6`. Las nuevas interfaces en una subred de doble pila obtienen una asignación `/96` automáticamente, con su primer `/128` suministrado a través de DHCPv6.

<Warning>
  Un prefijo IPv6 en la subred y una dirección en la NIC **no** hacen que nada sea alcanzable. La accesibilidad de IPv6 también depende de las rutas y de las reglas de los grupos de seguridad — vea [La accesibilidad de IPv6 es la ruta](/es/networking/gateways#ipv6-reachability-is-the-route-not-the-address).
</Warning>

<a id="deleting-a-subnet" />

## Eliminar una subred

Tres cosas lo bloquean, y el error nombra la que lo hizo:

| Bloqueador de anuncios | Lo que dice el error |
| - | - |
| Interfaces que aún están en la subred | "la subred todavía tiene *N* interfaz(es) — elimínelas primero" |
| Una puerta de enlace NAT vive aquí | "puerta de enlace NAT de los hosts de subred *nombre* — elimínelo primero" |
| Una dirección está en poder de otro recurso | nombres de la dirección y el titular |

La tercera es la más sorprendente. El VIP de un balanceador de carga se mantiene dentro de su subred sin ser una interfaz. La eliminación rechaza en lugar de soltar la dirección debajo del recurso que la posee.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.