Host-Firewall konfigurieren

Standardmäßig lässt die Host-Firewall von Container-Optimized OS ausgehende Verbindungen zu und akzeptiert eingehende Verbindungen nur über den SSH-Dienst. Um die genaue Konfiguration der Host-Firewall einzusehen, führen Sie sudo iptables -L auf einer VM-Instanz aus, auf der Container-Optimized OS läuft.

Beachten Sie: Die Regeln der Host-Firewall unterscheiden sich von denen Virtual Private Cloud-Firewall, die ebenfalls konfiguriert werden müssen, damit Ihre Anwendungen ordnungsgemäß funktionieren. Weitere Informationen zu den Firewallregeln für Virtual Private Cloud finden Sie in der Übersicht über Firewallregeln.

Container im Standardnetzwerk-Namespace von Docker ausführen

Wenn Sie einen Container mit Container-Optimized OS bereitstellen, der über das Netzwerk zugänglich sein muss, und die Option --net=host von Docker nicht verwenden, führen Sie den Container mit der Option -p von Docker aus. Mit dieser Option konfiguriert Docker automatisch die Host-Firewall, um Ihre Anwendung im Netzwerk verfügbar zu machen. Weitere Informationen zu den Docker-Ausführungsoptionen finden Sie in der Referenz zur Docker-Ausführung.

Im folgenden Beispiel kann im Netzwerk über Port 80 auf den nginx-Container zugegriffen werden:

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

Container im Netzwerk-Namespace des Hosts ausführen

Wenn Sie einen Container mit Container-Optimized OS bereitstellen, auf den über das Netzwerk zugegriffen werden muss, und die --net=host-Option von Docker verwenden, müssen Sie die Host-Firewall selbst explizit konfigurieren.

Sie können die Host-Firewall mit iptables-Standardbefehlen konfigurieren. Wie bei den meisten GMD/Linux-Distributionen bleiben mit iptables-Befehlen konfigurierte Firewallregeln auch nach einem Neustart nicht erhalten. Um sicherzustellen, dass die Host-Firewall bei jedem Start richtig konfiguriert ist, konfigurieren Sie die Host-Firewall in Ihrer cloud-init-Konfiguration. Dazu ein Beispiel für 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

Die Verwendung der cloud-init-Konfiguration mit einer VM, auf der Container-Optimized OS ausgeführt wird, löst bei jedem Start das folgende Verhalten aus:

  • Die Host-Firewall ist so konfiguriert, dass über Port 80 eingehende TCP-Verbindungen zugelassen werden.
  • Ein nginx-Container überwacht Port 80 und antwortet auf eingehende HTTP-Anfragen.

Weitere Informationen zur Verwendung von cloud-init mit dem Container-Optimized OS finden Sie unter Instanzen erstellen und konfigurieren.