Fail2Ban 구조 이해
CODE
/etc/fail2ban/
├── fail2ban.conf # 메인 설정 (수정 금지)
├── jail.conf # 기본 jail 설정 (수정 금지)
├── fail2ban.local # 로컬 오버라이드
├── jail.local # jail 로컬 설정 (여기서 수정)
├── filter.d/ # 필터 정의
└── action.d/ # 액션 정의jail.local 기본 설정
INI
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.0.0/16
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h커스텀 필터 작성
애플리케이션 로그에서 실패 패턴을 찾는 정규식 필터입니다.
INI
# /etc/fail2ban/filter.d/myapp.conf
[Definition]
# 실패 로그 예시: 2025-05-27 10:23:45 LOGIN_FAILED from 203.0.113.45
failregex = ^%Y-%m-%d %H:%M:%S LOGIN_FAILED from <HOST>$
^.* authentication failure.* rhost=<HOST>.*$
# 무시할 패턴
ignoreregex = ^.* from 127\.0\.0\.1.*$Bash
# 필터 테스트
fail2ban-regex /var/log/myapp/auth.log /etc/fail2ban/filter.d/myapp.conf -v
# jail에 추가
# /etc/fail2ban/jail.local
[myapp]
enabled = true
filter = myapp
logpath = /var/log/myapp/auth.log
maxretry = 5
bantime = 2hNginx 로그인 실패 차단
INI
# /etc/fail2ban/filter.d/nginx-auth.conf
[Definition]
failregex = ^<HOST> -.*"POST /api/login HTTP.*" (401|403) .*$
# /etc/fail2ban/jail.local
[nginx-auth]
enabled = true
filter = nginx-auth
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 5m
bantime = 1h커스텀 액션 — Slack 알림
INI
# /etc/fail2ban/action.d/slack-notify.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -X POST -H 'Content-type: application/json' \
--data '{"text":"🚫 Fail2Ban: <ip> banned in <name> (%(bantime)s)"}' \
https://hooks.slack.com/services/YOUR/WEBHOOK/URL
actionunban =
# jail.local에 추가
[myapp]
action = iptables-multiport[name=myapp, port="80,443"]
slack-notify화이트리스트 · 블랙리스트
Bash
# IP 화이트리스트 (영구 무시)
# jail.local [DEFAULT] ignoreip에 추가
ignoreip = 127.0.0.1/8 1.2.3.4 10.0.0.0/8
# 즉시 특정 IP 차단 (수동)
fail2ban-client set sshd banip 203.0.113.45
# 차단 해제
fail2ban-client set sshd unbanip 203.0.113.45상태 확인 명령
Bash
# 전체 상태
fail2ban-client status
# 특정 jail 상태
fail2ban-client status sshd
# 현재 차단된 IP 목록
fail2ban-client status sshd | grep "Banned IP"
# 실시간 로그
tail -f /var/log/fail2ban.log
# 재시작 (설정 변경 후)
sudo systemctl reload fail2ban편집 안내 · Editorial Note
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
관련 공식 문서OWASP 공식 문서 ↗
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.