docker사용시 centos의 firewall를 bypass하는 문제

문제라기보다는 docker 자체에서 iptables에 체인을 별도로 만들어 운영합니다. ㅠ.ㅠ
반나절동안 삽질하다가 알게되어 공유차원에서 올립니다.
생각해보니 클라우드환경에서는 방화벽이 별도로 운영되어 별다른 문제는 없을 듯합니다.

centos 7 부터는 iptables를 wrapper한 firewall-cmd를 이용합니다. 그래서, firewall-cmd만 들여다보고 있다보면 해결이 어렵게됩니다.

[문제]

  1. 로컬 테스트서버에 centos7 & docker-ce설치
  2. firewall-cmd가 정상작동중임을 확인함.
  3. portainer container를 생성후 아웃바운드에서 들어오는 포트를 portainer 포트로 포워딩함.
  4. 혹시나 하는 마음에 외부에서 portainer로 접속함.
  5. 접속이 이루어짐…ㅠ.ㅠ

[확인]

  1. centos나 ubuntu도 같은 현상이 발생하는 것 같습니다.
  2. docker가 iptables에 별도의 체인을 만들어 운영합니다.
  3. docker홈페이지에는 DOCKER-USER 체인을 핸들링하라고 나옵니다. iptables를 이용한 방법만 제시되어 있습니다.
  4. 검색결과 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 존으로 처리가 됩니다.

좋아요 4

이 글은 질문이 아니라 경험공유 글에 더 가깝지 않을까요…?

좋아요 4

@level120 님 감사합니다. 제가 글을 잘못 파악한 것 같습니다.

@_jeonghwan 님 죄송합니다. 글의 요지를 잘못 파악해서 질문 답변 게시판으로 옮겼는데, 정보 공유 게시판으로 다시 옮기겠습니다. 불편을 드려 죄송합니다. :pray:

좋아요 2

저도 어디에 써야할지 잘몰라서 그냥 자게에 썼습니다.~~^^

좋아요 3