/엔지니어/보안 설정/fail2ban으로 SSH 무차별 대입 차단 — j
보안 설정중급UbuntuDebianCentOSRHELfail2banssh보안

fail2ban으로 SSH 무차별 대입 차단 — jail 설정과 모니터링

fail2ban으로 SSH 브루트포스를 자동 탐지·차단합니다. jail.local 핵심 파라미터, recidive 영구 차단, 이메일 알림, Cloudflare·ipset 연동, 운영 명령까지 정리합니다. SSH 기본 하드닝은 별도 가이드 참고.

이 가이드의 범위

이 글은 fail2ban으로 SSH 무차별 대입(brute-force) 공격을 자동 차단하는 데 집중합니다. SSH 키 인증 전환·sshd_config 하드닝 같은 기본 설정은 먼저 SSH 설정·접근 제어 완전 가이드로 끝내 두세요.

전제: SSH 포트를 2222로 바꾸고 키 인증만 허용한 상태.


설치와 jail.local

기본 jail.conf는 패키지 업데이트 시 덮어쓰이므로 항상 jail.local에 오버라이드합니다.

Bash
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
INI
# /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  = 1d
Bash
sudo 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 자신의 로그를 다시 감시하는 방식입니다.

INI
# /etc/fail2ban/jail.local
[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s   # 모든 포트 차단
bantime  = 1w
findtime = 1d
maxretry = 5

이메일 알림 연동

차단이 발생할 때 메일로 통지받으려면 action을 메일 포함 버전으로 바꿉니다.

INI
[DEFAULT]
destemail = [email protected]
sender    = [email protected]
mta       = sendmail
# 차단 + whois + 관련 로그까지 메일에 포함
action    = %(action_mwl)s

Cloudflare · ipset 연동 — 엣지에서 차단

서버 앞단(Cloudflare)이나 커널 ipset에서 끊으면 부하가 줄고 차단이 더 빨라집니다.

INI
# Cloudflare API로 차단 (방화벽 규칙 생성)
[sshd]
action = cloudflare[cfuser="[email protected]", cftoken="API_TOKEN"]
INI
# 또는 ipset + iptables (대량 IP를 O(1)로 차단)
[DEFAULT]
banaction = iptables-ipset-proto6-allports

운영 — 상태 확인 · 수동 차단/해제

Bash
# 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가 두드리는지 직접 확인합니다.

Bash
# 실패한 로그인 시도
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 설정·접근 제어 완전 가이드를 참고하세요.

#fail2ban#ssh#보안#무차별대입#brute-force#서버보안#모니터링
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.