FirewallD 및 docker: 포트가 공개적으로 액세스되지 않도록 차단

FirewallD 및 docker: 포트가 공개적으로 액세스되지 않도록 차단

현재 Centos8 및 Firewalld에서 실행 중인 2개의 Docker 컨테이너에 대한 액세스를 제한하는 데 몇 가지 문제가 있습니다. 먼저 컨테이너의 구성은 다음과 같습니다.

services:
  service1:
    ports:
      - 1234:1234
  service2:
    ports:
      - 6969:6969

Docker 영역에는 다음과 같은 (기본) 구성이 있습니다.

docker (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: br-b2ef50b272a2 docker0
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:

이런 식으로 남겨둘 때 docker-compose up을 실행하면 애플리케이션이 실행되고 애플리케이션 간에 통신이 이루어지지만 해당 포트도 공용 인터넷을 통해 액세스할 수 있습니다. 나의 궁극적인 목표는 애플리케이션 간의 내부 통신을 유지하되 해당 포트에 대한 공개 액세스를 차단하고 특정 IP만 허용하는 것입니다. 지금까지 내가 성공하지 못한 일:

  1. 먼저 docker zone의 대상을 로 변경해 보았습니다. default 이로 인해 두 애플리케이션 간의 통신이 끊어졌을 뿐 다른 영향은 없었습니다.
  2. 풍부한 규칙이 추가되었습니다. rule family="ipv4" source NOT address="X.X.X.X" port port="6969" protocol="tcp" reject 규칙이 무시되었습니다.

두 서비스가 서로 통신할 수 있는 동안 FirewallD 및 docker 영역을 사용하여 이러한 포트에 대한 액세스를 차단하는 방법이 있습니까?

답변1

설정에 역방향 프록시 서비스를 추가한 다음 service1 및 service2 포트 노출을 중지하고 역방향 프록시가 트래픽을 필터링하도록 할 수 있습니다.

포트를 노출하지 않으면 컨테이너는 계속해서 서로 통신할 수 있으며(동일한 Docker 네트워크 내에서) 내장된 Docker DNS를 통해 서비스 이름으로 IP를 확인할 수 있습니다. (예: 서비스 1, 서비스 2)

이 경우 작성 파일은 대략 다음과 같습니다.

services:
  service1:

  service2:

  proxy:
    ports:
      - 80:80
      - 443:443
      - <extra ports>:<extra ports>

예를 들어 추가 구성으로 nginx 컨테이너를 사용할 수 있습니다. (프록시가 해당 서비스에서 지정한 외부 포트를 수신하도록 구성되어 있는지 확인하세요.)

location /service1 {
    allow X.X.X.X;
    deny  all;
    proxy_pass http://service1:1234;
}

location /service2 {
    allow X.X.X.X;
    deny  all;
    proxy_pass http://service2:6969;
}

또는 nginx 구성에서 각각 서비스 포트에서 수신 대기하는 두 개의 "서버" 지시문을 만든 다음, URL 경로를 추가하지 않으려는 경우 루트 위치("/")를 통해 트래픽을 전달할 수 있습니다.

또한 이를 통해 서비스의 여러 복사본을 실행하고 모두 동일한 포트에서 수신 대기하면서 역방향 프록시를 통해 서비스를 노출하고 트래픽을 필터링할 수 있습니다.

관련 정보