ホスト ファイアウォールの構成

デフォルトでは、Container-Optimized OS のホスト ファイアウォールを使用すると SSH サービスのみを介した発信接続と受信接続が許可されます。Container-Optimized OS を実行している VM インスタンスで sudo iptables -L を実行することで、正確なホスト ファイアウォール構成を確認できます。

ホスト ファイアウォールは Virtual Private Cloud ファイアウォール ルールとは異なり、アプリケーションが正しく機能するように構成する必要があります。Virtual Private Cloud ファイアウォール ルールの詳細については、ファイアウォール ルールの概要をご覧ください。

Docker のデフォルトのネットワーク名前空間でコンテナを実行する

Container-Optimized OS にコンテナをデプロイし、ネットワーク経由でアクセス可能になる必要があるが、Docker の --net=host オプションを使用しない場合は、Docker の -p オプションを使用してコンテナを実行します。このオプションを使用すると、Docker はアプリケーションをネットワーク上に公開するためのホスト ファイアウォールを自動的に構成します。Docker の実行オプションの詳細については、Docker の実行リファレンスをご覧ください。

次の例では、ポート 80 でネットワーク上の nginx コンテナにアクセスできます。

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

ホストのネットワーク名前空間でコンテナを実行する

Container-Optimized OS にコンテナをデプロイし、ネットワーク経由でアクセス可能になる必要があり、Docker の --net=host オプションを使用している場合、ホスト ファイアウォールを明示的に構成する必要があります。

ホスト ファイアウォールは、標準の iptables コマンドで構成できます。ほとんどの Linux ディストリビューションと同様、iptables コマンドで構成されたファイアウォール ルールは再起動後すると失われます。起動時にホスト ファイアウォールが正しく構成されるようにするには、cloud-init 構成でホスト ファイアウォールを構成します。次に 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

Container-Optimized OS を実行している VM でこの cloud-init 構成を使用すると、起動するたびに次のように動作します。

  • ホスト ファイアウォールは、ポート 80 で受信 TCP 接続を許可するように構成されます。
  • nginx コンテナはポート 80 をリッスンし、受信 HTTP リクエストに応答します。

Container-Optimized OS で cloud-init を使用する方法については、インスタンスの作成と構成をご覧ください。