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 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가 변경되게 됩니다.
다들 아시다시피 Iptable 정책은 top-down 방식으로 적용이 됩니다. 그러니 허용 시키고 싶은 정책이 있으시면 DROP 정책 전에 적용을 하시면 됩니다.
또한 172.16.0.0/12를 허용해 주는 이유는 Container에서 먼저 통신을 시작하는 경우 DOCKER-USER chain을 통과할 때는 Container의 IP, 즉 172.16.x.x IP를 가지고 있는 상태이기 때문에 적용을 해 주어야 합니다. 이 부분이 적용되지 않을 경우 외부에서 먼저 통신을 시도하는 경우에는 통신이 되겠지만, Container에서 먼저 시도하는 경우는 실패하게 됩니다.
이제 외부에서 컨테이너로의 접속에 대해서 제한을 걸게 되었으니 보안을 조금 더 강화하게 되었습니다.