Engineering/Network

docker 사용 시, iptables 로 방화벽 설정하기 (DOCKER-USER Chain)

알탱2 2021. 11. 29. 22:52
반응형

 linux 환경에서 실행되는 application의 network 단절 상황에서의 예외 케이스 테스트를 위해 종종 iptables로 패킷 차단을 활용해왔다. 하지만 최근에는 host에서 application을 직접 실행하는 것 보다는 docker container 안에서 application을 실행하는 형상이 많아졌고, 동일하게 iptables의 INPUT packet 차단을 해보니 packet drop이 되지 않고 connect 성공이 되었다;;

 엔지니어링 경험이 좀 더 많은 분께 tip을 얻어 INPUT이 아니라 DOCKER Chain에 drop 룰을 추가하니 그제서야 packet drop이 잘 되었다. 그 당시에는 추가 검색을 해볼 시간적 여유가 없이 그대로 테스트에 활용하고 넘어갔었는데, 이후 새로 입사하신 다른 팀원분이 금일 동일한 현상에 대해 문의하여 구글링을 좀 더 해보았다.

 Docker docs (link) 사이트 내용도 좀 참고하고, 실제 몇 가지 실험을 해본 내용을 정리해 두려고 한다.

 

* iptables로 ip, port, source, destination, protocol 등의 선택적 옵션들은 이 포스트에서는 생략한다. 특정 port에 대한 INPUT packet을 drop 하는 옵션으로 고정한 후, 룰을 등록하는 chain 만 변경하며 테스트를 하려고 한다.

* simple하게 재현 테스트를 위해 아래 캡쳐와 같이 -p 8888:8888 옵션으로 host의 8888 port를 test-iptables 라는 container의 8888 port로 mapping 구성한 container를 생성하였고, 그 안에서 curl로 GET / 요청 시, alive 응답을 주는 dummy server를 실행해 두었다.

 

 

(1) INPUT Chain에 destination port 8888 로 들어오는 packet 차단하기

 

linux host에서 실행한 application의 경우 이 방법으로 packet drop이 잘 되었었다. 해당 재현은 생략한다.

iptables -D INPUT -p tcp --dport 8888 -j DROP

위와 같이 룰이 추가됨을 확인 후, 동일하게 GET / 요청을 해보았더니 alive 응답을 잘 수신하는 현상이 발생하였다.

나는 host에 8888 port로 들어오는 packet을 차단한 것이었는데 외부에서 들어오는 packet이 차단 되지 않은 것이다!!!

 

 

(2) DOCKER-USER Chain에 destination port 8888 로 들어오는 packet 차단하기

Docker docs에 의하면 DOCKER Chain에 등록된 룰에 해당하는 경우는 DOCKER Chain에 해당하는 룰이 우선된다는 정보를 보고 이번엔 DOCKER-USER Chain에 추가를 해보도록 한다.

iptables -I DOCKER-USER -p tcp --dport 8888 -j DROP

위와 같이 룰이 추가됨을 확인 후, 동일하게 GET / 요청을 해보았더니 alive 응답이 오지 않고 connection 실패 에러 메세지가 출력되었다!!! 성공!!!

 

반응형