Categories
Docker 서버

Docker 의 컨테이너내에서 외부 도메인 접속 문제 해결하기 (iwinv ELCAP 방화벽 설정)

현재 스마일서브 iwinv 클라우드 서버 호스팅을 사용하고 있는데 여러 계정을 거의 동일한 환경에서 동작하도록 Docker 를 활용하고 있습니다.

iwinv 계정으로 여러개 가지고 있다 보니 실수한 부분이 있는데… 이 때문에 3일이나 삽질하다 겨우 해결한 과정을 지금부터 적어보고자 합니다. (분을 삭히는 중.. ㅜㅜ;; 멍청한 나..)

문제 증상

몇개의 iwinv 계정의 서버는 docker compose 설정을 실행해 도커 컨테이너가 실행되면 컨테이너 내부에서 외부 도메인의 API 에 접근하여 처리하는 기능을 가지고 있었습니다.

그런데 마지막 새로 만든 iwinv 계정에서는 귀차니즘에 방화벽 설정이 조금 다르게 설정했었는데요. 이게 이렇게 큰 문제가 될줄이야.. 그때는 몰랐지요. ㅜㅜ

일단 마지막 설정한 docker compose 설정으로 올린 컨테이너에서는 외부 도메인에 접속할 때 한참을 기다리다 처음보는 오류를 띄우며 중단되기만 합니다.

이뿐만 아니라 도커 원격 관리를 위해 portainer 도 설치 해놨는데 다른 호스팅계정의 것과는 달리 App Templates 선택해도 목록이 나오지 않더라고요.

portainer 에서 컨테이너 로그를 보면…

2020/11/10 02:56:33 http error: Unable to retrieve templates via the network (err=Get https://raw.githubusercontent.com/portainer/templates/master/templates-2.0.json: dial tcp: i/o timeout) (code=500)

이런식으로 외부 주소에 접속하지 못하는 것으로 나옵니다.

이 때부터 뭔가 문제가 있다는 것을 확인하고 해결해 보려고

ufw 도 disable 시켜보고…

> sudo ufw disable

iptables 도 아래와 같이 초기화하고 docker 데몬 재시작도 해보고…

> sudo iptables -t filter -F
> sudo iptables -t filter -X
> sudo systemctl restart docker 

iwinv 관리 콘솔로 가서 방화벽설정에 Outbound 에대해 TCP PORT 1-65535, 0:0:0:0 (모든포트, 모든 IP) 허용하도록 바꿔보기도하고…

하지만 여전히 도커 컨테이너에서는 외부 도메인에 접속이 되지 않았습니다.

그 후에는 DNS 문제인 것으로 보고 컨테이너나 도커 데몬 설정에 DNS 서버값 설정을 변경해 보기도 했습니다.

하지만 여전히 외부접속은 안되더군요 ㅜㅜ

iwinv 기술지원에 지원요청 문의도 남겨봤지만 단순히 호스팅 서버에서 외부 접속만 테스트 해보고 잘되니 다른 문제점 찾아보라고만 하더군요.

문제 원인

거의 포기 할 때쯤 검색하다가 어디선가 DNS Outbound 는 TCP와 UDP 포트 둘 다 사용한다는 것을 보았습니다.

https://stackoverflow.com/questions/64078387/docker-containers-unable-to-connect-to-internet

맨 아래 채택된 답변을 해석해 보면 Outbound 트래픽이 UDP에 대해서는 블럭해놨고 TCP 트래픽만 허용한 것으 문제라고 예기하고 있네요.

더 정확히는 DNS 는 Zone 전송을 위해 TCP를 사용하고 도메인 이름 질의를 위해서는 UDP 를 사용한다고 나와있습니다.

드디어 해결책을 찾았습니다!

일단 기존 문제없는 호스팅계정의 방화벽 설정을 보니 진짜로 DNS UDP 53 포트가 전체 IP에 대해 열리도록 설정이 들어 있더군요. 분명 예전에 알아서 열여뒀던거 같은데 중요하지 않다고 생각해서 까먹었던거 같습니다. (그래서 지금 눈물을 머금고 열심히 여기에 적고 있습니다. ㅜㅜ;; )

문제 해결

바로 문제되는 서버호스팅의 방화벽에서 DNS Outbound 사용을 위해 TCP 53포트, UDP 53포트를 해제해 보았습니다.

그리고 테스트해보니 이번에는 제대로 도메인을 찾았는지 드디어 제대로 호출이 됩니다. ㅜㅜ

portainer 도 App Templates 들어가보니 정상적으로 목록이 뜹니다. ㅎㅎ

3일동안 끙끙하며 해맸던 문제를 드디어 풀었네요. 항상 이런 문제는 해결하고 나면 거의 상식적인 부분인데 말이죠.

아무튼 원인을 찾아서 해결해서 다행이라고 생각합니다. 다른 분들은 덜 해매시길 바라며… 이글을 적어둡니다.