Limit IP connections to Docker Container on CentOS

Docker 컨테이너의 외부 통신 설정

 

Docker 로 컨테이너를 생성하고 포트를 연동하면 기본적으로 외부와 통신이 되도록 설정입니다.

예로 elasticsearch_exporter만 실행시킨 정보입니다.

dockerfile
-----------
version: '3.7'
services:
  elasticsearch_exporter:
    image: justwatch/elasticsearch_exporter:1.1.0
    command:
     - '--es.uri=http://localhost:9200'
    restart: always
    ports:
    - 9114:9114

docker-container

위의 이미지와 같이 DOCKER chain에 모든 IP에 대해서 허용이 되어 있습니다.

그래서 왜 저렇게 되나 문서를 확인해 보니 Docke는 Container가 생성 될 때 Iptables의 Docker chain에 모든 IP에 대해서 허용하는게 기본적인 동작입니다.

모든 IP에 대해서 허용은 해커에게 문 열어 놨으니 들어오세요나 마찬가지입니다.

그리하여 외부의 접근을 제한하기 위해서 구글링부터 도커 공식 문서까지 확인하였으며 다음과 같은 방법으로 제한이 가능했습니다.

 

Docke는 Iptables에서 Docker chain보다 DOCKER-USER chain을 먼저 보도록 설정을 합니다.

그리하여 제한을 걸고 싶으면 DOCKER-USER chain에 설정을 하라고 합니다.

firewall-cmd를 이용하여 재 시작시에서 정책이 적용되도록 다음과 같이 입력을 합니다.

firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 -s 172.16.0.0/12 -j RETURN
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 10 -s 0.0.0.0/0 -j DROP
firewall-cmd --reload

 

입력이 완료 되면 firwall의 direct이 다음과 같이 설정 됩니다.

/etc/firewalld/direct.xml
--------------------------
<?xnk version="1.0" encoding="utf-8"?>
<direct>
  <chain ipv="ipv4" table="filter" chain="DOCKER-USER"/>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="1">-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="1">-s 172.16.0.0/12 -j RETURN/rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="10">-s 0.0.0.0/0 -j DROP</rule>
</direct>

 

위의 정책을 적용하게 되면 다음과 같이 Iptables가 변경되게 됩니다.

docker-container2

다들 아시다시피 Iptable 정책은 top-down 방식으로 적용이 됩니다. 그러니 허용 시키고 싶은 정책이 있으시면 DROP 정책 전에 적용을 하시면 됩니다.

또한 172.16.0.0/12를 허용해 주는 이유는 Container에서 먼저 통신을 시작하는 경우 DOCKER-USER chain을 통과할 때는 Container의 IP, 즉 172.16.x.x IP를 가지고 있는 상태이기 때문에 적용을 해 주어야 합니다. 이 부분이 적용되지 않을 경우 외부에서 먼저 통신을 시도하는 경우에는 통신이 되겠지만, Container에서 먼저 시도하는 경우는 실패하게 됩니다.

이제 외부에서 컨테이너로의 접속에 대해서 제한을 걸게 되었으니 보안을 조금 더 강화하게 되었습니다.

참고사이트
  – https://docs.docker.com/network/iptables/

You may also like...

Subscribe
Notify of
guest

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x