Configurar el firewall del host

Según la configuración predeterminada, el firewall del host de Container-Optimized OS permite solo las conexiones salientes, y acepta las conexiones entrantes únicamente a través del servicio SSH. Puedes ver la configuración exacta de firewall del host si ejecutas sudo iptables -L en una instancia de VM que ejecuta 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.

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

Si implementas un contenedor en Container-Optimized OS, debe ser accesible a través de la red, y no debes usar 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 en el puerto 80:

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

Ejecuta contenedores en el espacio de nombres de 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 los comandos iptables estándar. Al igual que con la mayoría de las distribuciones de GNU/Linux, las reglas de firewall configuradas con comandos de iptables no persistirán en 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 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 Crea y configura instancias para obtener más información sobre el uso de cloud-init en Container-Optimized OS.