fail2ban 부정행위 적발 시 Docker 접속 막기

Composite·2024년 11월 8일
0


이미지 출처: https://github.com/crazy-max/docker-fail2ban

Docker 는 특성상 iptables 를 메인으로 관리한다. 모던 관리를 원하는 관리자에게는 골치아픈 일이긴 하다.
ufw 사용하도록 세팅했을 경우는... 혹시라도 겪어본 일 있으면 따로 다루도록 하겠다.
이번 팁은 iptables 기준 팁이다. nftables 의 경우 해결책 찾으면 여기에 수정하도록 하겠다.

1. Docker 안에 fail2ban

fail2ban 상에서 가장 쉽고 확실한 방법이다. Supabase Postgresql 에서 사용한 방법이고, 부정행위 사용자에게 ufwiptables 로 해당 IP 등을 차단 대상에 등록하도록 스크립트를 실행한다.

해당 리눅스 배포판에 맞는 패키지 관리자로 fail2ban 깔고 filterjail 만들면 땡이다. 액션은 기존에 있는 iptablesufw 등 방화벽 유틸리티를 활용하면 되니까. 위 Supabase postgresql 가면 소스 있으니 참고하면 되겠다.

2. Docker host 에서 fail2ban

내가 사용한 방법이다. 왜냐면 내가 사용하려는 Docker container 는 배포판을 쓰기 때문에 간섭하기 껄끄럽기 때문이다.
그래서, 호스트 상에서 실행중인 앱이나 서버의 경우는 부정행위 차단이 잘 되는데,
유독 Docker 통해서 서비스하는 포트들은 부정행위를 해서 차단하려고 iptables 등의 방화벽에 차단 등록을 했는대도 불구하고...

잘 들어가진다.

왜지?

원흉은

망할 Docker가 그가 만든 규칙 자체를 따르도록 설계되어 있기 때문에 그랬던 것이다.
그래서... 아래 명령어로 해결했다.

$ sudo iptables -I FORWARD -j [fail2ban-명칭]
# 예를 들어 sudo iptables -I FORWARD -j f2b-myservice

모든 Chain 을 죄다 fail2ban 이름에 포워딩 시켰더니 해결됐다. 이 뭔...
fail2ban 에 등록된 Chain 찾는 방법은 간단하다. 먼저 sudo iptables -nL 치면 처음과 마지막에 대충 fail2ban 이나 f2b 키워드가 보일 것이다. | egrep 'fail2ban|f2b' 로 파이프 치면 더 잘 보일 것이다.

Chain INPUT (policy ACCEPT)
target         prot opt source               destination         
f2b-myservice  6    --  0.0.0.0/0            0.0.0.0/0
# ...
Chain f2b-myservice (2 references)
target     prot opt source               destination         
REJECT     0    --  (밴당한IP)            0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

여하튼 위에 결과에서 나온 f2b- 라고 써있는 걸 긁어서 죄다 포워딩 시키면 된다.
간단하긴 하지만... 참 거지같기도 하다.

그리고 sudo iptables-save 쳐서 영구 저장하도록 하자.
등록 여부 확인 방법은 sudo iptables -nL 쳐서

Chain FORWARD (policy DROP)
target     prot opt source               destination         
f2b-myservice   0    --  0.0.0.0/0            0.0.0.0/0           
DOCKER-USER  0    --  0.0.0.0/0            0.0.0.0/0
# ...

FORWARD 테이블에 등록한 항목 보이면 성공이고, 지우고 싶다면, 알지?

$ sudo iptables -D FORWARD -j [fail2ban-명칭]
# 예를 들어 sudo iptables -D FORWARD -j f2b-myservice

내가 왜 이거 때문에 3시간을 허비한 것일까 싶다... 원래 별거 아닌거 때문에 몇시간 허비하는 것 만큼 허탈과 해탈한 느낌을 지울 수 없는 게 당연지사.

참고: iptables reject rule doesn't work if FORWARD rules (to DOCKER) present and take precedence over INPUT

끗.

profile
지옥에서 온 개발자
post-custom-banner

0개의 댓글