쪽팔리면 질문하지 맙시다. 소중한 답변 댓글을 삭제하는건 부끄러운 일 입니다
안녕하세요. 거진 일주일을 삽질해봐도 답이 나오지 않아 문의드립니다.
현재 공부도 할 겸, Docker-compose 를 통해 DB, 웹서버 등을 각각의 컨테이너로 구축하여 운용 중에 있습니다.
DB 를 사용하는 컨테이너가 여러개 돌아가는 상황이라, DB 와 Web 을 각각의 컨테이너로 구성하였습니다.
이런 상황에서, 각 컨테이너에서 접근해야 하는 사용자에게만 DB 컨테이너로의 접근을 허가하고, 나머지 IP 에서는 접근을 차단하려고 합니다.
(단일 서버 내에서 docker container 끼리 통신해야 하는 상황)
이를 위해 Docker-compose 에서 별도의 network 를 생성하고, 모든 컨테이너에 각각의 static IP 부여, 각각의 유저에 대한 접근 권한을 설정하였습니다.
그러나, 정작 DB서버 로그를 확인해 보면, 컨테이너 IP 가 아닌 네트워크의 게이트웨이 IP 가 찍혀 DB 서버로의 정상적인 접근이 불가능한 상황입니다.
예를 들어, 네트워크 게이트웨이 IP가 172.1.0.1 이고, A (172.1.0.4) 가 DB 로 접속할 컨테이너, B (172.1.0.2) 가 DB 컨테이너라고 해 보면,
A 에서만 a_admin 유저로 접속을 허가하기 위해, DB 유저 생성 시 'a_admin'@'172.1.0.4' 로 지정하였습니다.
그러나 A 에서 접속이 불가능하여 DB 로그를 확인해 보면, 'a_admin'@'172.1.0.1' 이라 출력됩니다.
그러니깐, DB 컨테이너 측에서는 Inbound IP 를 게이트웨이 IP로 인식해버리는 상황입니다.
A 에서 B 로 ping 을 날리고, B 측에서 tcpdump 를 통해 확인해 봐도, 172.1.0.4 가 아닌 172.1.0.1 이 찍힙니다.
혹시 몰라서, 네트워크와 고정 IP를 설정하지 않고, Docker 에서 기본으로 잡아주는 것을 사용하면,
DB 에서는 희안하게 A 컨테이너의 IP 를 잘 인식합니다.
이론 상, Static IP 를 지정하면, (모든 컨테이너는 단일 서버에서 돌아가므로) IP 를 통해 특정 컨테이너만 접속을 허가할 수 있을 것이라 생각하였는데,
이론이 틀린건지, 설정에 문제가 있는건지,, 공부하기도 쉽지 않네요.
ping 을 날려도 동일한 것을 보면 docker 자체 문제라고 생각되긴 하지만.. 뭐가 문제인지 모르겠습니다.
Google 서치를 해 봐도, 이런 사례는 도무지 찾아볼 수 없어서 여쭙고자 합니다. 아래쪽에 docker-compose.yml 설정 일부 발췌하 남겨두겠습니다.
고견 미리 감사드립니다 :D
version: "3.8" services: database: container_name: database image: mariadb:latest expose: - "3306" networks: customNet: ipv4_address: 172.1.0.2 client: container_name: client networks: customNet: ipv4_address: 172.1.0.4 networks: customNet: driver: bridge ipam: config: - subnet: 172.1.0.0/16 gateway: 172.1.0.1
위와 같은 방법을 해야한다면 DB를 reverse proxy를 통해서 접속하게 한 다음, 그 reverse proxy 과정에서 allow와 deny를 해볼 것 같습니다.
나머지 데이터베이스에는 접근할 수 없구요.
리버스 프록시는, 이 문제가 해결되지 않으면 도입해볼까 싶었는데,, 리버스프록시 셋팅도 좀 알아봐야겠네요.
답변 감사드립니다~
예를 들어 NIC에 192.168.100.254/24를 할당후 컨테이너들을 192.168.100.0/24의 주소대를 할당하는 방법입니다
외부 통신이 필요하다면 네트워크 장비쪽에 해당 서브넷을 추가해주고, NAT 처리하면 정상 처리됩니다
브릿지로 호스트랑 동일 네트워크에 붙이면 제대로 알아먹을껍니다
지금 상태가 무조건 컨테이너-GW-컨테이너 이렇게 통신이 되는것같으니까요
저렇게 한경우 외부 접근 막을려면 NIC쪽의 주소 하나만 deny로 등록하면 됩니다
랄까 2개의 컨테이너가 동일 서버라면 애초에 서버의 방화벽에서 안 열어주면 외부에서 접근이 안 됩니다 (다른 컨테이너는 접근 가능)
이 방법 도입도 고려해봐야겠습니다. 답변 감사드립니다~
다만 접근 금지쪽은 설정 안 해놔서 (필요하면 네트워크 장비에서 설정하는지라) 어떻게 될지 모르겠네요
작업전 원복 편하게 설정파일 백업해두신다음 시도해보세요 (나중에 원복시 이걸 덮어쓰고, NIC의 주소만 제거하면 됨)
주소 추가 -> 주소 설정 변경및 재실행 -> 패킷이 어떻게 흘러가는지 확인
이정도만 해봐도 잘 되는지 확인은 가능할껍니다 (성공하면 바로 갈꺼고, 실패하면 NIC에 새로 추가한 주소를 경유해서 갈테니까요)
NIC 에 서브넷 추가하는 방향으로 알아봐야겠네요.
즐거운 한가위 보내세요~
아무래도 bridge 식이 아니고 nat식으로 구성이 되지 않았나 싶습니다.
bridge는 자신의 ip를 갖고 그것으로 통신히지만 nat는 상위의 ip로 접근을 하게 되어 있으니까요.
db쪽에서 gateway의 ip가 보인다는건 gateway가 nat가 되어 proxy를 해주고 있는 듯 합니다.
네트워크 설정 부분을 좀 살펴보셔야 할 듯 합니다.
docker-compose network 관련 설정을 좀 찾아보면서, 삽질 좀 더 해봐야 할 것 같네요. 답변 감사드립니다~