문제라기보다는 docker 자체에서 iptables에 체인을 별도로 만들어 운영합니다. ㅠ.ㅠ
반나절동안 삽질하다가 알게되어 공유차원에서 올립니다.
생각해보니 클라우드환경에서는 방화벽이 별도로 운영되어 별다른 문제는 없을 듯합니다.
centos 7 부터는 iptables를 wrapper한 firewall-cmd를 이용합니다. 그래서, firewall-cmd만 들여다보고 있다보면 해결이 어렵게됩니다.
[문제]
- 로컬 테스트서버에 centos7 & docker-ce설치
- firewall-cmd가 정상작동중임을 확인함.
- portainer container를 생성후 아웃바운드에서 들어오는 포트를 portainer 포트로 포워딩함.
- 혹시나 하는 마음에 외부에서 portainer로 접속함.
- 접속이 이루어짐…ㅠ.ㅠ
[확인]
- centos나 ubuntu도 같은 현상이 발생하는 것 같습니다.
- docker가 iptables에 별도의 체인을 만들어 운영합니다.
- docker홈페이지에는 DOCKER-USER 체인을 핸들링하라고 나옵니다. iptables를 이용한 방법만 제시되어 있습니다.
- 검색결과 firewall-cmd에서는 direct 옵션으로 iptables를 직접 핸들링 하는 방법으로 처리하면 된다고합니다.
[해결]
다음 내용을 스크립트로 만들어 실행하면 되겠습니다.
# Removing DOCKER-USER CHAIN (it won't exist at first)
firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
# Flush rules from DOCKER-USER chain (again, these won't exist at first; firewalld seems to remember these even if the chain is gone)
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
# Add the DOCKER-USER chain to firewalld
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
# Add rules (see comments for details)
# "This allows docker containers to connect to the outside world"
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# "allow internal docker communication"
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -j RETURN -s 172.17.0.0/16
# "my allowed ip address to http and https ports"
#firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -p tcp -m multiport --dports https -s 123.456.7.89/32 -j ACCEPT
#Add as many ip or other rules and then run this command to block all other traffic
# "reject all other traffic"
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -j DROP
# restart the services
systemctl stop docker
systemctl stop firewalld
systemctl start firewalld
systemctl start docker
[추가내용]
테스트해보니 DOCKER-USER 체인은 docker network driver중 bridge에 해당합니다.
network mode가 host인 경우에는 firewall-cmd public 존으로 처리가 됩니다.