호스트 방화벽 구성

기본적으로 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 실행 참조를 확인하세요.

다음 예시에서 nginx 컨테이너는 네트워크 포트 80에서 액세스할 수 있습니다.

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

호스트 네트워크 네임스페이스에서 컨테이너 실행

네트워크에서 액세스할 수 있어야 하는 컨테이너를 Container-Optimized OS에 배포하지만 Docker --net=host 옵션을 사용하지 않을 때는 호스트 방화벽을 직접 명시적으로 구성해야 합니다.

표준 iptables 명령어로 호스트 방화벽을 구성할 수 있습니다. 대부분의 GNU/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 사용에 대한 자세한 내용은 인스턴스 만들기 및 구성을 참조하세요.