이 글은 Fail2ban을 실무 환경에 안전하고 효과적으로 적용하는 방법을 단계별로 설명합니다. 설치, 기본 설정, 필터·액션 커스터마이징, nftables·ipset 연동, 그리고 흔한 문제의 원인과 해결 방법을 구체적 명령어와 함께 제공합니다.
Fail2ban은 시스템/애플리케이션 로그를 모니터링해 특정 패턴(예: 로그인 실패)이 반복되면 방화벽 규칙으로 해당 IP를 자동 차단합니다. 주로 SSH, 웹로그인, FTP 등 무차별 대입 공격 방어에 사용됩니다.
# 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
Fail2ban의 핵심 파일은 다음과 같습니다.
/etc/fail2ban/jail.conf
— 기본 설정(업데이트 시 덮어쓰여질 수 있음)./etc/fail2ban/jail.d/*.conf
및 /etc/fail2ban/jail.local
— 사용자 설정(우선 적용)./etc/fail2ban/filter.d/*.conf
— 정규식 기반 필터 정의./var/log/fail2ban.log
— 동작 로그.
# /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
.
필터는 /etc/fail2ban/filter.d/NAME.conf
에 정의되며, 로그 라인의 특정 패턴을 찾아냅니다. 정규식 작성 시 주의할 점:
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
대량의 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 파일을 사용하세요.
# 전체 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
문제: Fail2ban이 IP를 차단하지 않음.
원인: 잘못된 logpath, 필터 미스매치, 또는 action 권한 문제. 해결: sudo fail2ban-regex
로 로그-필터 매칭 확인, fail2ban 로그 확인, action 스크립트에 실행 권한 및 경로 확인.
문제: 잘못 차단된 IP를 자동으로 해제하지 않음.
원인: bantime 설정 오류 또는 action에서 unban 명령이 실패. 해결: fail2ban 로그에서 unban 관련 에러 검토, ipset/nftables 상태에서 수동으로 삭제 후 fail2ban 재시작.
문제: Regex가 성능 저하 유발.
원인: 비효율적인 정규식(복잡한 backtracking). 해결: 더 구체적인 패턴 사용, fail2ban-regex로 성능 테스트, 필터에서 불필요한 캡처 그룹 제거.
logtarget
및 logpath
설정을 점검하세요.Fail2ban은 로그 기반 자동 차단의 표준 도구입니다. 올바른 logpath, 정확한 필터, 그리고 nftables/ipset와의 연동을 통해 대규모 환경에서도 안정적으로 동작합니다. 정규식과 액션을 신중히 설계하고, 테스트·모니터링을 습관화하세요.
리눅스 at 명령어로 예약 작업 관리하기 실무 가이드 (1) | 2025.08.12 |
---|---|
리눅스 서버 접속 기록 확인하는 법 last 명령어 실전 사용법 정리 (3) | 2025.07.31 |
빠른 서버 포트 확인 netstat 관련 옵션으로 쉽게 끝내기 (2) | 2025.07.29 |
서버 느릴 때 확인하는 ps 명령어 조합 – Rocky 리눅스 실전 방법 (3) | 2025.07.28 |
Rocky Linux 방화벽 설정 후 netstat로 연결 확인하기 (2) | 2025.07.26 |