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 실패 에러 메세지가 출력되었다!!! 성공!!!
'Engineering > Network' 카테고리의 다른 글
[tcpdump] 덤프 파일 사이즈가 커서 wireshark로 열리지 않는 경우를 대비하여 pcap 파일 분할하여 저장하기 (0) | 2024.01.10 |
---|---|
iptables 활용하여 Connection timeout, Response timeout 테스트 하기 (0) | 2022.04.04 |
iptables 로 일부 문자(string)가 포함된 packet만 차단하기 (string match) (0) | 2022.03.28 |
wireshark : display filter로 원하는 protocol, ip, port 만 filtering 하기 (0) | 2021.08.16 |
[tcpdump] 네트워크 패킷 캡쳐하기 (자주 사용하는 옵션 정리) (0) | 2021.07.25 |
댓글