대상 OS: Debian 12 (bookworm)
SSH는 서버 운영의 생명줄이지만, 공격자에게도 가장 흔한 입구입니다.
포트를 바꾸고 키 인증을 써도, 스캔과 시도는 매일같이 계속됩니다.
중요한 건 ‘한두 번의 실패’를 로그로 남기는 것에서 끝나지 않고, 반복 시도를 자동으로 끊어내는 겁니다.
Fail2ban은 인증 실패 로그를 보고 공격 IP를 차단하는, 오래됐지만 여전히 실용적인 도구입니다.
이 글은 Debian 12에서 Fail2ban을 nftables 백엔드로 운영하며, SSH 무차별 대입을 자동 차단하는 방법을 “설치→정책→검증→오탐 대응” 순서로 정리합니다.
---
왜 Fail2ban을 ‘기능’이 아니라 ‘정책’으로 봐야 하나
Fail2ban은 단순히 설치한다고 끝나지 않습니다.
차단 시간이 너무 길면 오탐이 사고가 되고, 너무 짧으면 공격 억제가 약해집니다.
화이트리스트를 안 잡으면 운영자/배포망이 막히고, 너무 넓게 잡으면 우회가 생깁니다.
그래서 Fail2ban은 “우리 조직의 SSH 운영 정책”을 코드로 만드는 작업에 가깝습니다.
---
준비물(현재 상태 확인)
1) SSH 로그가 어디에 찍히는지 확인
sudo journalctl -u ssh -n 50 --no-pager
sudo grep -R "^LogLevel" -n /etc/ssh/sshd_config /etc/ssh/sshd_config.d 2>/dev/null || true
2) nftables 사용 여부 확인
sudo nft list ruleset | sed -n '1,120p'
Debian 12는 기본적으로 nftables 환경을 잘 지원하므로, Fail2ban도 nftables 액션을 쓰는 편이 깔끔합니다.
---
설치 및 서비스 기동
1) 패키지 설치
sudo apt update
sudo apt -y install fail2ban nftables
2) 서비스 활성화
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager
3) Fail2ban 동작 확인
sudo fail2ban-client ping
sudo fail2ban-client status
---
nftables 기본 방화벽(최소 예시)
이미 운영 중인 nftables 정책이 있다면 그대로 유지하고, Fail2ban이 “차단용 set/chain”만 추가하도록 두는 게 보통 좋습니다.
아래는 테스트/소규모 서버용 최소 예시입니다.
1) 규칙 파일 백업
sudo nft list ruleset > /root/nftables.backup.$(date +%F_%H%M%S).txt
2) (없을 때만) 기본 input 정책 예시
sudo tee /etc/nftables.conf >/dev/null