Configurar el firewall del host

De forma predeterminada, el firewall del host de Container-Optimized OS permite conexiones salientes y acepta conexiones entrantes solo a través del servicio SSH. Para ver la configuración exacta del firewall del host, ejecuta sudo iptables -L en una instancia de VM que ejecute Container-Optimized OS.

Ten en cuenta que el firewall del host es diferente de las reglas de firewall de la nube privada virtual, que también deben configurarse para que tus aplicaciones funcionen correctamente. Consulta la Descripción general de las reglas de firewall para obtener más información sobre las reglas de firewall de la nube privada virtual.

Cómo ejecutar contenedores en el espacio de nombres de red predeterminado de Docker

Si implementas un contenedor en Container-Optimized OS al que se debe poder acceder desde la red y no usas la opción --net=host de Docker, ejecuta tu contenedor con la opción -p de Docker. Con esta opción, Docker configurará automáticamente el firewall del host para exponer tu aplicación en la red. Consulta la referencia de ejecución de Docker para obtener más información sobre las opciones de ejecución de Docker.

En el siguiente ejemplo, se podrá acceder al contenedor nginx en la red del puerto 80:

docker run --rm -d -p 80:80 --name=nginx nginx

Ejecuta contenedores en el espacio de nombres de la red del host

Si implementas un contenedor en Container-Optimized OS al que se debe acceder mediante la red y usas la opción --net=host de Docker, debes configurar el firewall del host de forma explícita.

Puedes configurar el firewall del host con comandos iptables estándar. Al igual que con la mayoría de las distribuciones de GNU/Linux, las reglas de firewall configuradas con comandos iptables no se conservarán en todos los reinicios. Para asegurarte de que el firewall del host esté configurado de forma correcta en cada inicio, configura el firewall del host en tu configuración de cloud-init. Considera el siguiente ejemplo de cloud-init:

#cloud-config

write_files:
- path: /etc/systemd/system/config-firewall.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Configures the host firewall

    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- path: /etc/systemd/system/myhttp.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=My HTTP service
    After=docker.service config-firewall.service
    Wants=docker.service config-firewall.service

    [Service]
    Restart=always
    ExecStart=/usr/bin/docker run --rm --name=%n --net=host nginx
    ExecStop=-/usr/bin/docker exec %n -s quit

runcmd:
- systemctl daemon-reload
- systemctl start myhttp.service

El uso de esta configuración de cloud-init con una VM que ejecuta Container-Optimized OS dará como resultado los siguientes comportamientos en cada inicio:

  • El firewall del host se configurará para permitir conexiones TCP entrantes en el puerto 80.
  • Un contenedor nginx escuchará en el puerto 80 y responderá a las solicitudes HTTP entrantes.

Consulta Cómo crear y configurar instancias para obtener más información sobre el uso de cloud-init en Container-Optimized OS.