Fail2ban 설정 가이드 실무 적용과 문제 해결 완벽 정리
이 글은 Fail2ban을 실무 환경에 안전하고 효과적으로 적용하는 방법을 단계별로 설명합니다. 설치, 기본 설정, 필터·액션 커스터마이징, nftables·ipset 연동, 그리고 흔한 문제의 원인과 해결 방법을 구체적 명령어와 함께 제공합니다.
1. Fail2ban 개요 및 사용처
Fail2ban은 시스템/애플리케이션 로그를 모니터링해 특정 패턴(예: 로그인 실패)이 반복되면 방화벽 규칙으로 해당 IP를 자동 차단합니다. 주로 SSH, 웹로그인, FTP 등 무차별 대입 공격 방어에 사용됩니다.
2. 설치 및 서비스 확인
# Debian/Ubuntu
sudo apt update && sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
# RHEL/CentOS/Rocky
sudo yum install -y epel-release
sudo yum install -y fail2ban
sudo systemctl enable --now fail2ban
# 서비스 상태 확인
sudo systemctl status fail2ban
sudo fail2ban-client version
3. 핵심 파일 구조와 기본 원칙
Fail2ban의 핵심 파일은 다음과 같습니다.
/etc/fail2ban/jail.conf
— 기본 설정(업데이트 시 덮어쓰여질 수 있음)./etc/fail2ban/jail.d/*.conf
및 /etc/fail2ban/jail.local
— 사용자 설정(우선 적용)./etc/fail2ban/filter.d/*.conf
— 정규식 기반 필터 정의./var/log/fail2ban.log
— 동작 로그.
4. 기본 Jail 설정 예제
# /etc/fail2ban/jail.d/local.conf
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.0/24
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
filter = sshd
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
filter = nginx-http-auth
설정 변경 후에는 서비스 재시작을 권장합니다: sudo systemctl restart fail2ban
.
5. 필터 작성 및 정규식 팁
필터는 /etc/fail2ban/filter.d/NAME.conf
에 정의되며, 로그 라인의 특정 패턴을 찾아냅니다. 정규식 작성 시 주의할 점:
- 로그 타임스탬프나 호스트명 등 가변값을 비포함으로 정의.
- 필터는 failregex(매칭)와 ignoreregex(무시)를 모두 지원.
- 정규식 테스트는
fail2ban-regex
로 수행.
# 예: /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^%(__prefix_line)sFailed login for .* from \s*$
ignoreregex =
# 테스트
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/myapp.conf
6. nftables 및 ipset 연동 (고성능 차단)
대량의 IP를 차단할 때는 ipset + nftables 조합이 효율적입니다. Fail2ban의 action을 커스터마이즈해 ipset에 추가하도록 설정할 수 있습니다.
# ipset 설치 및 세트 생성 예
sudo apt install -y ipset
sudo ipset create f2b-blacklist hash:ip family inet
# nftables 규칙 예
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0 ; }'
sudo nft add rule inet filter input ip saddr @f2b-blacklist drop
# Fail2ban action 예: /etc/fail2ban/action.d/iptables-ipset.conf (간단화)
[Definition]
actionstart = ipset restore ...
actionban = ipset add f2b-blacklist
actionunban = ipset del f2b-blacklist
Fail2ban 0.11 이상에서는 nftables용 기본 액션을 제공하는 경우가 있습니다. 배포판 버전을 확인하고 적절한 action 파일을 사용하세요.
7. 모니터링 및 운영 명령어
# 전체 jail 상태 확인
sudo fail2ban-client status
# 특정 jail 상세
sudo fail2ban-client status sshd
# 수동 차단/해제
sudo fail2ban-client set sshd banip 198.51.100.10
sudo fail2ban-client set sshd unbanip 198.51.100.10
# 로그 실시간 추적
sudo tail -f /var/log/fail2ban.log
8. 흔한 문제와 해결 방법
문제: Fail2ban이 IP를 차단하지 않음.
원인: 잘못된 logpath, 필터 미스매치, 또는 action 권한 문제. 해결: sudo fail2ban-regex
로 로그-필터 매칭 확인, fail2ban 로그 확인, action 스크립트에 실행 권한 및 경로 확인.
문제: 잘못 차단된 IP를 자동으로 해제하지 않음.
원인: bantime 설정 오류 또는 action에서 unban 명령이 실패. 해결: fail2ban 로그에서 unban 관련 에러 검토, ipset/nftables 상태에서 수동으로 삭제 후 fail2ban 재시작.
문제: Regex가 성능 저하 유발.
원인: 비효율적인 정규식(복잡한 backtracking). 해결: 더 구체적인 패턴 사용, fail2ban-regex로 성능 테스트, 필터에서 불필요한 캡처 그룹 제거.
9. 고급 팁
- 정책 테스트는 프로덕션 적용 전에 staging 환경에서 수행하세요.
- 로그 로테이션에 따라 fail2ban가 로그 파일을 잃지 않도록
logtarget
및logpath
설정을 점검하세요. - 장기 차단이 필요한 경우 중앙의 SIEM과 연동해 이벤트 기반으로 수동 검토 후 IP를 영구 블랙리스트에 추가하세요.
- 분산 공격 대응은 단일 호스트 차단만으로 부족하므로 upstream(네트워크 레벨) 차단이나 CDN 방어를 병행하세요.
10. 요약
Fail2ban은 로그 기반 자동 차단의 표준 도구입니다. 올바른 logpath, 정확한 필터, 그리고 nftables/ipset와의 연동을 통해 대규모 환경에서도 안정적으로 동작합니다. 정규식과 액션을 신중히 설계하고, 테스트·모니터링을 습관화하세요.