이 가이드의 범위
이 글은 fail2ban으로 SSH 무차별 대입(brute-force) 공격을 자동 차단하는 데 집중합니다. SSH 키 인증 전환·sshd_config 하드닝 같은 기본 설정은 먼저 SSH 설정·접근 제어 완전 가이드로 끝내 두세요.
전제: SSH 포트를 2222로 바꾸고 키 인증만 허용한 상태.
설치와 jail.local
기본 jail.conf는 패키지 업데이트 시 덮어쓰이므로 항상 jail.local에 오버라이드합니다.
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h # 차단 유지 시간
findtime = 10m # 이 시간 내 실패를 카운트
maxretry = 5 # 임계치 초과 시 차단
ignoreip = 127.0.0.1/8 ::1 203.0.113.10 # 내 고정 IP는 화이트리스트
backend = systemd # journald 사용 시
[sshd]
enabled = true
port = 2222 # sshd_config에서 바꾼 포트와 일치시킬 것
maxretry = 3
bantime = 1dsudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd # jail 동작 확인포트 불일치 주의: SSH 포트를 바꿨다면 [sshd]의 port도 같은 값으로 맞춰야 로그가 매칭됩니다. 안 맞으면 차단이 전혀 동작하지 않습니다.
핵심 파라미터 — bantime · findtime · maxretry
| 파라미터 | 의미 | 권장 |
|---|---|---|
findtime | 실패 횟수를 세는 관찰 창 | 10m |
maxretry | 이 횟수 초과 시 차단 | SSH 3 |
bantime | 한 번 차단 시 유지 시간 | 1d (반복 시 가중) |
bantime = -1로 두면 영구 차단이지만, 오탐 시 본인이 잠길 수 있어 아래 recidive jail로 점증 차단하는 편이 안전합니다.
반복 위반자 영구 차단 — recidive jail
짧은 밴이 풀리자마자 다시 두드리는 IP를 장기 차단합니다. fail2ban 자신의 로그를 다시 감시하는 방식입니다.
# /etc/fail2ban/jail.local
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s # 모든 포트 차단
bantime = 1w
findtime = 1d
maxretry = 5이메일 알림 연동
차단이 발생할 때 메일로 통지받으려면 action을 메일 포함 버전으로 바꿉니다.
[DEFAULT]
destemail = [email protected]
sender = [email protected]
mta = sendmail
# 차단 + whois + 관련 로그까지 메일에 포함
action = %(action_mwl)sCloudflare · ipset 연동 — 엣지에서 차단
서버 앞단(Cloudflare)이나 커널 ipset에서 끊으면 부하가 줄고 차단이 더 빨라집니다.
# Cloudflare API로 차단 (방화벽 규칙 생성)
[sshd]
action = cloudflare[cfuser="[email protected]", cftoken="API_TOKEN"]# 또는 ipset + iptables (대량 IP를 O(1)로 차단)
[DEFAULT]
banaction = iptables-ipset-proto6-allports운영 — 상태 확인 · 수동 차단/해제
# jail 상태와 현재 차단 IP
sudo fail2ban-client status sshd
# 특정 IP 수동 차단 / 해제
sudo fail2ban-client set sshd banip 1.2.3.4
sudo fail2ban-client set sshd unbanip 1.2.3.4
# 전체 jail 재로드(설정 변경 후)
sudo fail2ban-client reload로그인 시도 모니터링
차단 규칙이 잘 듣는지, 어떤 IP가 두드리는지 직접 확인합니다.
# 실패한 로그인 시도
journalctl -u ssh | grep "Failed password" | tail -20
# IP별 실패 횟수 (공격 출처 상위)
journalctl -u ssh | grep "Failed password" \
| grep -oE "from [0-9.]+" | awk '{print $2}' | sort | uniq -c | sort -rn | head
# fail2ban이 실제로 밴한 기록
sudo zgrep "Ban " /var/log/fail2ban.log* | tail -20자기 차단 방지: 작업용 고정 IP는 반드시 ignoreip에 넣으세요. 빠졌다가 본인이 밴되면 콘솔(웹 KVM)로만 풀 수 있습니다. 기본 SSH 하드닝은 SSH 설정·접근 제어 완전 가이드를 참고하세요.
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.