# Contenedores en entornos aislados (Air-Gapped)





Los contenedores en entornos aislados (Air-gapped containers) te permiten restringir el acceso a la red de los contenedores controlando dónde pueden enviar y recibir datos. Esta característica aplica reglas de proxy personalizadas al tráfico de red de los contenedores, lo que ayuda a proteger entornos donde los contenedores no deben tener un acceso ilimitado a Internet.

Docker Desktop puede configurar el tráfico de red de los contenedores para aceptar conexiones, rechazar conexiones o canalizar el tráfico a través de proxies HTTP o SOCKS. Tú controlas a qué puertos TCP se aplica la política y si se debe utilizar un único proxy o políticas por destino a través de archivos de Autoconfiguración de Proxy (Proxy Auto-Configuration - PAC).

## ¿Quién debería usar contenedores en entornos aislados?

Utiliza contenedores en entornos aislados si:

- Tu organización requiere que los contenedores se comuniquen únicamente con servicios internos aprobados.
- Necesitas cumplir con estándares de conformidad que exigen aislamiento de red (como SOC 2, ISO 27001 o PCI DSS).
- Deseas evitar que los contenedores filtren datos o accedan a puntos finales externos no aprobados durante las compilaciones o en el tiempo de ejecución.

## Cómo funcionan los contenedores en entornos aislados

Los contenedores en entornos aislados interceptan el tráfico de red del contenedor y aplican reglas de proxy:

1. Intercepción del tráfico: Docker Desktop intercepta todas las conexiones de red salientes de los contenedores.
2. Filtrado de puertos: Solo el tráfico en los puertos especificados (`transparentPorts`) está sujeto a las reglas del proxy.
3. Evaluación de reglas: Las reglas del archivo PAC o las configuraciones de proxy estáticas determinan cómo manejar cada conexión.
4. Gestión de conexiones: El tráfico se permite directamente, se enruta a través de un proxy o se bloquea según las reglas.

Algunas consideraciones importantes son:

- El ajuste de `proxy` existente sigue aplicándose al tráfico de la aplicación Docker Desktop en el host.
- Si falla la descarga del archivo PAC, los contenedores bloquean las solicitudes a las URL de destino.
- El nombre de host está disponible para los puertos 80 y 443, pero solo se dispone de direcciones IP para otros puertos.

## Requisitos previos

Antes de configurar contenedores en entornos aislados, debes tener:

- La [imposición del inicio de sesión](/enterprise/security/enforce-sign-in/) habilitada para asegurar que los usuarios se autentiquen en tu organización.
- Una suscripción de Docker Business.
- Configurada la [Gestión de Ajustes](/enterprise/security/hardened-desktop/settings-management/) con el archivo `admin-settings.json` para administrar las políticas de la organización.

## Configurar contenedores en entornos aislados

Agrega el proxy de contenedores a tu [archivo `admin-settings.json`](/enterprise/security/hardened-desktop/settings-management/configure-json-file/). Por ejemplo:

```json
{
  "configurationFileVersion": 2,
  "containersProxy": {
    "locked": true,
    "mode": "manual",
    "http": "",
    "https": "",
    "exclude": [],
    "pac": "http://192.168.1.16:62039/proxy.pac",
    "transparentPorts": "*"
  }
}
```

### Parámetros de configuración

El ajuste `containersProxy` controla las políticas de red aplicadas al tráfico de contenedores:

| Parámetro | Descripción | Valor |
|-----------|-------------|-------|
| `locked` | Evita que los desarrolladores anulen los ajustes | `true` (bloqueado), `false` (por defecto) |
| `mode` | Método de configuración de proxy | `system` (usar proxy del sistema), `manual` (personalizado) |
| `http` | Servidor proxy HTTP | URL (ej., `"http://proxy.company.com:8080"`) |
| `https` | Servidor proxy HTTPS | URL (ej., `"https://proxy.company.com:8080"`) |
| `exclude` | Omitir proxy para estas direcciones | Matriz de nombres de host/IPs |
| `pac` | URL del archivo de Autoconfiguración de Proxy | URL al archivo PAC |
| `transparentPorts` | Puertos sujetos a las reglas de proxy | Puertos separados por comas o comodín (`"*"`) |

### Ejemplos de configuración

Bloquear todo el acceso externo:

```json
"containersProxy": {
  "locked": true,
  "mode": "manual",
  "http": "",
  "https": "",
  "exclude": [],
  "transparentPorts": "*"
}
```

Permitir servicios internos específicos:

```json
"containersProxy": {
  "locked": true,
  "mode": "manual",
  "http": "",
  "https": "",
  "exclude": ["internal.company.com", "10.0.0.0/8"],
  "transparentPorts": "80,443"
}
```

Enrutar a través del proxy corporativo:

```json
"containersProxy": {
  "locked": true,
  "mode": "manual",
  "http": "http://corporate-proxy.company.com:8080",
  "https": "http://corporate-proxy.company.com:8080",
  "exclude": ["localhost", "*.company.local"],
  "transparentPorts": "*"
}
```

## Archivos de Autoconfiguración de Proxy (PAC)

Los archivos PAC proporcionan un control detallado sobre el acceso a la red de los contenedores al definir reglas para diferentes destinos.

### Estructura básica de un archivo PAC

```javascript
function FindProxyForURL(url, host) {
	if (localHostOrDomainIs(host, 'internal.corp')) {
		return "PROXY 10.0.0.1:3128";
	}
	if (isInNet(host, "192.168.0.0", "255.255.255.0")) {
	    return "DIRECT";
	}
    return "PROXY reject.docker.internal:1234";
}
```

### Consideraciones generales

 - El formato del parámetro URL en la función `FindProxyForURL` es `http://host_o_ip:puerto` o `https://host_o_ip:puerto`.
 - Si tienes un contenedor interno que intenta acceder a `https://docs-docker.esdocu.com/enterprise/security/hardened-desktop/air-gapped-containers`, el servicio proxy de Docker enviará `docs-docker.esdocu.com` para el valor del host y `https://docs-docker.esdocu.com:443` para el valor de la URL a `FindProxyForURL`. Si utilizas la función `shExpMatch` en tu archivo PAC de la siguiente manera:

   ```console
   if(shExpMatch(url, "https://docs-docker.esdocu.com:443/enterprise/security/*")) return "DIRECT";
   ```

   La función `shExpMatch` fallará; en su lugar, utiliza:

   ```console
   if (host == docs-docker.esdocu.com && url.indexOf(":443") > 0) return "DIRECT";
   ```

### Valores de retorno de un archivo PAC

| Valor de retorno | Acción |
|--------------|--------|
| `PROXY host:port` | Enrutar a través del proxy HTTP en el host y puerto especificados |
| `SOCKS5 host:port` | Enrutar a través del proxy SOCKS5 en el host y puerto especificados |
| `DIRECT` | Permitir conexión directa sin proxy |
| `PROXY reject.docker.internal:any_port` | Bloquear la solicitud por completo |

### Ejemplo avanzado de archivo PAC

```javascript
function FindProxyForURL(url, host) {
  // Permitir el acceso a Docker Hub para imágenes base aprobadas
  if (dnsDomainIs(host, ".docker.io") || host === "docker.io") {
    return "PROXY corporate-proxy.company.com:8080";
  }

  // Permitir repositorios de paquetes internos
  if (localHostOrDomainIs(host, 'nexus.company.com') ||
      localHostOrDomainIs(host, 'artifactory.company.com')) {
    return "DIRECT";
  }

  // Permitir herramientas de desarrollo en puertos específicos
  if (url.indexOf(":3000") > 0 || url.indexOf(":8080") > 0) {
    if (isInNet(host, "10.0.0.0", "255.0.0.0")) {
      return "DIRECT";
    }
  }

  // Bloquear el acceso al localhost del desarrollador
  if (host === "host.docker.internal" || host === "localhost") {
    return "PROXY reject.docker.internal:1234";
  }

  // Bloquear todo el demás acceso externo
  return "PROXY reject.docker.internal:1234";
}
```

## Verificar la configuración de contenedores en entornos aislados

Después de aplicar la configuración, comprueba que las restricciones de red del contenedor funcionen:

Probar acceso bloqueado:

```console
$ docker run --rm alpine wget -O- https://www.google.com
# Debería fallar o agotar el tiempo de espera (timeout) según tus reglas de proxy
```

Probar acceso permitido:

```console
$ docker run --rm alpine wget -O- https://internal.company.com
# Debería completarse correctamente si internal.company.com está en tu lista de exclusión o reglas de PAC
```

Probar enrutamiento de proxy:

```console
$ docker run --rm alpine wget -O- https://docker.io
# Debería completarse correctamente si se enruta a través del proxy aprobado
```

## Consideraciones de seguridad

- Apicación de políticas de red: Los contenedores en entornos aislados funcionan a nivel de Docker Desktop. Los usuarios avanzados podrían eludir las restricciones a través de diversos medios, por lo que debes considerar controles adicionales a nivel de red para entornos de alta seguridad.
- Impacto en el flujo de trabajo de desarrollo: Las políticas excesivamente restrictivas pueden interrumpir los flujos de trabajo de desarrollo legítimos. Realiza pruebas exhaustivas y proporciona excepciones claras para los servicios necesarios.
- Gestión de archivos PAC: Aloja los archivos PAC en una infraestructura interna confiable. Las descargas fallidas de PAC resultan en un bloqueo del acceso a la red de los contenedores.
- Consideraciones de rendimiento: Los archivos PAC complejos con muchas reglas pueden afectar el rendimiento de red del contenedor. Mantén las reglas simples y eficientes.

## Siguientes pasos

- [Explorar el Aislamiento de Contenedores Mejorado](/enterprise/security/hardened-desktop/enhanced-container-isolation/) para restringir aún más lo que los contenedores pueden hacer en el tiempo de ejecución.
- [Comprender cómo maneja Docker Desktop las redes del host y del contenedor](/desktop/features/networking/)
