현재 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만 허용하는 것입니다. 지금까지 내가 성공하지 못한 일:
- 먼저 docker zone의 대상을 로 변경해 보았습니다.
default
이로 인해 두 애플리케이션 간의 통신이 끊어졌을 뿐 다른 영향은 없었습니다. - 풍부한 규칙이 추가되었습니다.
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 경로를 추가하지 않으려는 경우 루트 위치("/")를 통해 트래픽을 전달할 수 있습니다.
또한 이를 통해 서비스의 여러 복사본을 실행하고 모두 동일한 포트에서 수신 대기하면서 역방향 프록시를 통해 서비스를 노출하고 트래픽을 필터링할 수 있습니다.