도커 스웜(Docker Swarm)과 넷필터(Netfilter)

도커 스웜(Docker Swarm)과 넷필터(Netfilter)

Asp.Net Core 애플리케이션을 처리하기 위해 VPS에 Docker Swarm 서버를 배포했습니다. Nginx 웹 서버를 통해 이 앱을 제공하고 싶습니다.

내 웹 앱이 .Net Core CLI 명령을 통해 만든 바닐라 앱이라고 가정해 보겠습니다.

dotnet new webapp mywebapp

Dockerfile(간체):

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine as builder
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o publish
WORKDIR /app/publish
ENTRYPOINT ["dotnet", "MyWebApp.dll"]

docker-compose.yml모습은 다음과 같습니다(단순화).

version: '3'

services:
  app:
    image: edouard/mywebapp:latest
    ports:
      - 9000:80

내 nginx 구성은 다음과 같습니다.

server {
    listen 443 ssl;
    server_name myservername.com;

    ssl_certificate     /path/to/ssl_certificate;
    ssl_certificate_key /path/to/ssl_certificate_key;

   location / {
        proxy_pass         http://localhost:9000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    } 

}
server {
    listen 80;
    server_name myservername.com;
    return 301 https://$host$request_uri;
}

보시다시피 Nginx를 역방향 프록시 서버로 사용하여 80 및 443 포트의 모든 HTTP/HTTPS 트래픽을 로컬 9000 포트로 리디렉션합니다. 로컬 9000 포트는 Docker Swarm이 Kestrel 서버가 실행 중인 컨테이너 내부의 80 포트에 매핑됩니다. .

에서는 https://myservername.com모든 것이 잘 작동하고 있습니다. 하지만 중요한 점은 사람들이 에서 내 웹 앱에 액세스할 수도 있다는 것입니다 http://myservername.com:9000. 이것은 내가 원하지 않는 것입니다.

80 및 443 포트로만 트래픽을 허용하도록 방화벽을 구성해야 할 것 같습니다(SSH의 경우 22 포트 허용 등을 고려). 이 작업을 수행하는 방법을 알기 위해 몇 가지 튜토리얼을 읽었지만 Docker Swarm도 방화벽을 처리하고 있습니다!

내가 시작할 때 sudo iptables -L -v:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 3417  873K DOCKER-USER  all  --  any    any     anywhere             anywhere            
 3417  873K DOCKER-INGRESS  all  --  any    any     anywhere             anywhere            
   31  9043 DOCKER-ISOLATION-STAGE-1  all  --  any    any     anywhere             anywhere            
    0     0 ACCEPT     all  --  any    docker0  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  any    docker0  anywhere             anywhere            
    0     0 ACCEPT     all  --  docker0 !docker0  anywhere             anywhere            
    0     0 ACCEPT     all  --  docker0 docker0  anywhere             anywhere            
   18  7620 ACCEPT     all  --  any    docker_gwbridge  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  any    docker_gwbridge  anywhere             anywhere            
   13  1423 ACCEPT     all  --  docker_gwbridge !docker_gwbridge  anywhere             anywhere            
    0     0 DROP       all  --  docker_gwbridge docker_gwbridge  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  anywhere             anywhere            
   13  1423 DOCKER-ISOLATION-STAGE-2  all  --  docker_gwbridge !docker_gwbridge  anywhere             anywhere            
   31  9043 RETURN     all  --  any    any     anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  any    docker0  anywhere             anywhere            
    0     0 DROP       all  --  any    docker_gwbridge  anywhere             anywhere            
   13  1423 RETURN     all  --  any    any     anywhere             anywhere            

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 3417  873K RETURN     all  --  any    any     anywhere             anywhere            

Chain DOCKER-INGRESS (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 1567  101K ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:9000
 1270  698K ACCEPT     tcp  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED tcp spt:9000
   31  9043 RETURN     all  --  any    any     anywhere             anywhere            

Docker Swarm과 상호 작용하지 않도록 방화벽을 어떻게 구성해야 합니까? 답변의 일부를 찾았습니다.

그러나 나는 그것이 꽤 복잡하다고 생각하며 Docker 블로그에 이 문제에 대한 공식적인 답변이 없다는 사실에 놀랐습니다.

버전:

  • VPS: 데비안 10.2
  • 도커 엔진: 19.03.5
  • 엔진스: 1.16.1
  • IP테이블: 1.8.2

당신의 도움을 주셔서 감사합니다.

답변1

기본 0.0.0.0 주소 대신 localhost를 바인딩해 볼 수 있습니다.

services:
  app:
    image: edouard/mywebapp:latest
    ports:
      - '127.0.0.1:9000:80'

https://docs.docker.com/compose/compose-file/#ports

관련 정보