Docker (compose) UFW 무시하여 뚫리는 문제 해결

Docker compose 명령어로 서비스를 실행하였는데, UFW 방화벽이 도커 서비스의 포트를 못 막는 증상이 있었다. 공식 문서에 관련 내용이 있는지 찾아봤다.

https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw

AI 번역의 도움을 받아보면 :
Docker와 ufw는 방화벽 규칙을 사용하는 방식이 서로 호환되지 않습니다.
Docker에서 컨테이너의 포트를 publish(공개)하면, 해당 컨테이너로 들어오고 나가는 트래픽이 UFW 방화벽 설정을 거치기 전에 먼저 가로채어집니다. Docker는 컨테이너 트래픽을 nat 테이블에서 라우팅하기 때문에, 패킷은 UFW가 사용하는 INPUT과 OUTPUT 체인에 도달하기 전에 이미 다른 경로로 처리됩니다. 패킷이 방화벽 규칙이 적용되기 전에 라우팅되기 때문에, UFW 설정이 사실상 무시되는 효과가 납니다.

인터넷 검색해보면 해결법은 몇 가지가 있었다.
– iptables 규칙을 직접 짜서 막아버리기.
ufw-docker 라는 도구의 도움을 받기
– docker (compose) 서비스를 host 네트워크에 붙이기.

나는 세번째 방법이 흥미로웠다.
host(초대자)라 하면, 서버 컴퓨터가 아니겠는가?
docker service가 네트워크를 별도로 만들어 연결되는 특징이 있기 때문에 격리에 도움이 된다고 하는데, 서버 컴퓨터 네트워크에 직접 연결한다면 보안을 다소 포기하더라도 UFW로 접근을 제어할 수 있기 때문에 관리 편의성 면에서 이득이 있을 것이기 때문. (기본적인 로그인 제한 관련 보안사항들은 예전에 챙겼고.)

소문을 확인했으니, 나의 홈서버 간이 NAS 컴퓨터에 host network가 있는지 확인할 차례. docker network ls 명령어를 입력해보면 된다.

host 라는 이름의 네트워크가 있었다.

개별 docker 서비스마다 개발 언어/구조/설정 파일들이 전부 다르기 때문에, 각각의 서비스마다 host network로의 전환 방법 또한 다르다. 구글에서 이런 식으로 키워드를 입력하면 강력한 힌트들을 얻을 수 있을 것이다.

docker jellyfin change port network host

처리 결과 어떤 효과를 얻었는가 하면,
– UFW로 포트를 막으면 다른 컴퓨터들이 접근할 수 없음.
– UFW로 포트를 열면 다른 컴퓨터들이 접근할 수 있음.
– WireGuard VPN 클라이언트로 연결시, UFW로 포트가 막혀 있더라도 접근 가능. (스플릿 터널링 환경에서도 연결 됨)

아주 이상적인 결과가 나와서 뿌듯하다.

아무쪼록 비슷한 고민을 하는 분들께 도움이 되었으면 좋겠고, 정 안되면 의뢰를 하거나 상용 제품으로 가시라.

CC BY-NC-ND 4.0