이미지 출처: https://github.com/crazy-max/docker-fail2ban
Docker 는 특성상 iptables
를 메인으로 관리한다. 모던 관리를 원하는 관리자에게는 골치아픈 일이긴 하다.
ufw
사용하도록 세팅했을 경우는... 혹시라도 겪어본 일 있으면 따로 다루도록 하겠다.
이번 팁은 iptables
기준 팁이다. nftables
의 경우 해결책 찾으면 여기에 수정하도록 하겠다.
fail2ban 상에서 가장 쉽고 확실한 방법이다. Supabase Postgresql 에서 사용한 방법이고, 부정행위 사용자에게 ufw
나 iptables
로 해당 IP 등을 차단 대상에 등록하도록 스크립트를 실행한다.
해당 리눅스 배포판에 맞는 패키지 관리자로 fail2ban 깔고 filter
와 jail
만들면 땡이다. 액션은 기존에 있는 iptables
나 ufw
등 방화벽 유틸리티를 활용하면 되니까. 위 Supabase postgresql 가면 소스 있으니 참고하면 되겠다.
내가 사용한 방법이다. 왜냐면 내가 사용하려는 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시간을 허비한 것일까 싶다... 원래 별거 아닌거 때문에 몇시간 허비하는 것 만큼 허탈과 해탈한 느낌을 지울 수 없는 게 당연지사.
끗.