여러 노드가 있는 도커 떼가 있습니다. 이들은 wireguard 인터페이스를 통해 연결됩니다. 모든 docker swarm 통신은 wireguard가 제공하는 내부 네트워크 내에서 발생합니다. 아래 예에서 인터넷 연결 인터페이스는 eth0
이고 wireguard 인터페이스는 입니다 intr
.
스택에 ocks5 프록시를 추가했는데 작성 파일에는 다음과 같습니다.
services:
proxy:
hostname: proxy
image: httptoolkit/docker-socks-tunnel
ports:
- 1080:1080/tcp
내 목표는 이 서비스에 대한 액세스를 제한하여 intr 네트워크의 클라이언트(예: wireguard 인터페이스 시작)만 사용할 수 있도록 하는 것입니다.
내가 사용하는 최소한의 명령 세트는 다음과 같습니다.
# replace ufw with firewalld
systemctl stop docker
systemctl stop ufw
apt remove --purge ufw
apt install -y firewalld
systemctl enable firewalld
systemctl start firewalld
systemctl start docker
# add eth0 to public zone, this will prevent all incoming connections, except ssh and ipv6-dhcp
firewall-cmd --zone=public --add-interface=eth0
# allow 51830/udp (wireguard) so that the internal wireguard interfaces can connect on the nodes
firewall-cmd --zone=public --add-port=51820/udp --permanent
# create a new zone for intr, add the intr interface to it
firewall-cmd --new-zone=intr --permanent
firewall-cmd --zone=intr --add-interface=intr --permanent
# allow docker swarm ports on it
firewall-cmd --permanent --zone=intr --add-service=docker-swarm --permanent
# create a policy that allows traffic between docker and intr interfaces
firewall-cmd --permanent --new-policy docker-intr --set-target=ACCEPT
firewall-cmd --permanent --policy docker-intr --add-ingress-zone intr
firewall-cmd --permanent --policy docker-intr --add-egress-zone docker
# change default policy of "docker" zone to drop
firewall-cmd --permanent --zone=docker --set-target=DROP
# for this example, allow socks5 on intr zone
firewall-cmd --permanent --zone=intr --add-port=1080/tcp --permanent
firewall-cmd --reload
위의 명령을 실행한 후 정상적으로 작동하는 것 같습니다. Wireguard를 통해 액세스하려고 하면 포트가 열려 있습니다.
nc -vz -w1 10.1.2.1 1080`
Connection to 10.1.2.1 1080 port [tcp/socks] succeeded!
공개 주소에서 액세스하려고 하면 삭제됩니다.
nc -vz -w1 my.server.com 1080`
Connection to my.server.com (1.2.3.4) port 1080 (tcp) timed out: Operation now in progress
포트 2377/tcp(swarm)도 마찬가지입니다. 내부 인터페이스 주소에서는 열려 있는 것처럼 보이지만 공개 주소에서는 거부됩니다.
그러나 OS를 다시 시작하면 다음과 같은 일이 발생합니다.
- 2377/tcp(docker swarm)는 docker가 시작된 후에도 닫힌 상태로 유지됩니다.
- 1080/tcp(양말)는 eth0을 포함한 모든 인터페이스에서 열려 있습니다(양말 서비스 컨테이너가 시작된 후).
- 하지만
firewall-cmd --reload
1분 후에 실행하면 eth0에서 1080/tcp가 다시 다운됩니다.
아직 테스트하지는 않았지만 docker 스택을 종료하고 다시 시작하면 동일한 문제가 발생할 것으로 의심됩니다.
영구 방화벽 설정에 따라 1080/tcp를 꺼야 하지만 docker에 의해 동적으로 재정의됩니다. 이것이 어떻게 가능합니까? 공식 문서에 따르면 (https://docs.docker.com/network/packet-filtering-firewalls/#integration-with-firewalld), docker는 방화벽과 완벽하게 통합됩니다.
내가 뭘 잘못했나요?