Configurar el cortafuegos del host

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

Ten en cuenta que el cortafuegos del host es diferente de las reglas del cortafuegos 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 cortafuegos para obtener más información sobre las reglas de cortafuegos de la nube privada virtual.

Ejecutar contenedores en el espacio de nombres de red predeterminado de Docker

Si vas a implementar un contenedor en Container-Optimized OS que debe ser accesible a través de la red y no usas la opción --net=host de Docker, ejecuta el contenedor con la opción -p de Docker. Con esta opción, Docker configurará automáticamente el cortafuegos del host para exponer tu aplicación en la red. Consulta la referencia de Docker run para obtener más información sobre las opciones de Docker run.

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

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

Ejecutar contenedores en el espacio de nombres de red del host

Si vas a implementar un contenedor en Container-Optimized OS que debe ser accesible a través de la red y usas la opción --net=host de Docker, debes configurar explícitamente el firewall del host.

Puedes configurar el cortafuegos del host con comandos iptables estándar. Al igual que en la mayoría de las distribuciones GNU/Linux, las reglas de cortafuegos configuradas con comandos iptables no se conservarán tras reiniciar el sistema. Para asegurarse de que el cortafuegos del host esté configurado correctamente en cada arranque, configure el cortafuegos del host en su configuración de cloud-init. Veamos el siguiente cloud-init ejemplo:

#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

Si usas esta configuración de cloud-init con una VM que ejecuta Container-Optimized OS, se producirán los siguientes comportamientos en cada arranque:

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

Consulta el artículo Crear y configurar instancias para obtener más información sobre el uso de cloud-init en Container-Optimized OS.