Ⅰ. Fail2ban이란?
서버 로그 파일을 실시간으로 모니터링하다가 특정 패턴(로그인 실패 등)이 설정한 횟수를 초과하면 해당 IP를 방화벽에 자동 등록해 차단하는 오픈소스 침입 방지 도구입니다. Python으로 작성되었으며, iptables / nftables / firewalld 등 기존 방화벽과 연동해 동작합니다.
브루트 포스 공격 중 SSH 패스워드 스프레이, 딕셔너리 공격에 대한 가장 실용적인 자동 방어 도구입니다.
Ⅱ. Fail2ban 동작 원리
ⅰ. Fail2ban 동작 흐름
| [공격자] │ │ SSH 로그인 실패 반복 ↓ [/var/log/auth.log] ← 1) 로그 파일 실시간 감시 │ ↓ 2) 정규식 필터로 실패 패턴 감지 [Filter (정규식)] │ ↓ 3) findtime 내 maxretry 초과 여부 판단 [Jail (판단 엔진)] │ ↓ 4) 임계값 초과 시 Action 실행 [Action (iptables/nftables)] │ ↓ 5) 공격 IP 방화벽 차단 (bantime 동안) [차단 해제] ← 6) bantime 만료 후 자동 해제 |
ⅱ. Fail2ban 핵심 3요소
1) Filter: 로그에서 찾을 악성 패턴 (정규식)
2) Jail: 어떤 서비스, 몇 번 실패, 얼마나 차단할지 설정
3) Action: 차단 방법 (iptables, nftables, firewalld 등)
Ⅲ. Fail2ban 설치
| # CentOS / RHEL / Rocky Linux dnf install epel-release -y dnf install fail2ban -y # Ubuntu / Debian apt update && apt install fail2ban -y # 서비스 시작 및 자동 실행 등록 systemctl enable fail2ban --now # 상태 확인 systemctl status fail2ban fail2ban-client status |
Ⅳ. Fail2ban 설정 파일 구조
Fail2ban의 설정 파일은 .conf(기본값) / .local(사용자 커스텀) 이중 구조입니다.
| /etc/fail2ban/ ├── fail2ban.conf ← 전역 설정 (수정 금지) ├── fail2ban.local ← 전역 커스텀 (여기서 수정) ├── jail.conf ← jail 기본값 (수정 금지) ├── jail.local ← jail 커스텀 (★ 핵심 설정 파일) ├── jail.d/ ← 서비스별 개별 jail 파일 │ └── sshd.local └── filter.d/ ← 서비스별 정규식 필터 ├── sshd.conf ├── nginx-http-auth.conf └── apache-auth.conf |
※ 반드시 .conf가 아닌 .local 파일에 설정하세요. 패키지 업데이트 시 .conf는 덮어써지지만 .local은 유지됩니다.
Ⅴ. Fail2ban 핵심 설정 파라미터
| cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local vi /etc/fail2ban/jail.local |
| 파라미터 | 의미 | 기본값 | 권장값 |
| bantime | 차단 지속 시간 | 10분(600) | 1일(1d) 이상 |
| findtime | 실패 횟수 카운트 시간 범위 | 10분(600) | 1일(1d) |
| maxretry | 허용 실패 횟수 | 5회 | 3~5회 |
| banaction | 차단 방식 | iptables-multiport | nftables (최신 시스템) |
| ignoreip | 차단 예외 IP | 127.0.0.1/8 | 관리자 IP 추가 필수 |
Ⅵ. Fail2ban 실전 설정 — SSH 브루트포스 차단
ⅰ. 기본 설정 (jail.local)
| [DEFAULT] # 관리자 IP는 절대 차단하지 않도록 예외 처리 (필수!) ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 [관리자 공인IP] bantime = 1d # 1일 차단 findtime = 1d # 1일 내 maxretry = 5 # 5회 실패 시 차단 # 이메일 알림 (선택) destemail = admin@example.com action = %(action_mw)s # 차단 + 이메일 발송 [sshd] enabled = true port = 22 # SSH 포트 변경 시 함께 수정 logpath = /var/log/auth.log # Ubuntu/Debian # logpath = /var/log/secure # CentOS/RHEL maxretry = 3 bantime = 1d |
ⅱ. 고급 설정 — recidive jail (상습 공격자 장기 차단)
상습 공격자(차단됐다가 해제 후 또 공격하는 IP)를 4주 장기 차단하는 강화 설정입니다.
| # /etc/fail2ban/jail.d/sshd-hardening.conf [sshd] enabled = true maxretry = 3 findtime = 1d bantime = 1d # Recidive: 1주일 내 3번 차단된 IP → 4주 차단 [recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s # 모든 포트 차단 bantime = 4w findtime = 1w maxretry = 3 ※ recidive의 findtime은 반드시 sshd의 bantime보다 길어야 작동합니다. |
Ⅶ. Fail2ban 주요 명령어
ⅰ. 전체 jail 목록 확인
| fail2ban-client status |
ⅱ. 특정 jail 상세 상태 (차단된 IP 목록 포함)
| fail2ban-client status sshd |
ⅲ. IP 수동 차단
| fail2ban-client set sshd banip 1.2.3.4 |
ⅳ. IP 차단 해제 (실수로 관리자 IP 차단 시)
| fail2ban-client set sshd unbanip 1.2.3.4 |
ⅴ. 실시간 Fail2ban 로그 모니터링
| tail -f /var/log/fail2ban.log |
ⅵ. 차단 이력 확인
| grep "Ban" /var/log/fail2ban.log | tail -20 |
ⅶ. 설정 변경 후 재시작
| systemctl restart fail2ban |
ⅷ. 설정 문법 검사 (재시작 전 확인)
| fail2ban-client --test |
Ⅷ. SSH 외 다양 서비스에 적용
Fail2ban은 로그 파일이 있는 모든 서비스에 적용 가능합니다.
| # Nginx 로그인 실패 차단 [nginx-http-auth] enabled = true logpath = /var/log/nginx/error.log maxretry = 5 # Apache 로그인 실패 차단 [apache-auth] enabled = true logpath = /var/log/apache2/error.log maxretry = 5 # WordPress 로그인 차단 (wp-login.php 보호) [wordpress] enabled = true logpath = /var/log/nginx/access.log maxretry = 3 bantime = 1d # FTP 차단 [vsftpd] enabled = true port = ftp,ftp-data,ftps,ftps-data logpath = /var/log/vsftpd.log maxretry = 5 |
Ⅸ. Fail2ban 를 사용한 브루트 포스 공격 실제 차단 흐름
| 공격자가 SSH 로그인 3회 실패 ↓ Fail2ban이 /var/log/auth.log에서 패턴 감지 ↓ findtime(1일) 내 maxretry(3회) 초과 확인 ↓ iptables에 자동 DROP 규칙 추가 iptables -A f2b-sshd -s 1.2.3.4 -j REJECT ↓ bantime(1일) 후 자동 해제 ↓ recidive jail: 1주일 내 3번 차단 → 4주 차단 |
Ⅹ. Fail2ban 한계점 및 보완 방법
Fail2ban은 강력하지만 단독으로는 완벽하지 않습니다.
| 한계 | 보완 방법 |
| 분산 IP 공격(패스워드 스프레이) | 탐지 어려움 IP 화이트리스트 기반 접근 제한 병행 |
| IPv6 차단 | 설정 별도 필요 banaction6 설정 추가 |
| 관리자 IP 실수 차단 시 서버 접근 불가 | ignoreip에 관리자 IP 반드시 등록 |
| 클라우드 환경에서 NAT IP 차단 시 다수 피해 | 클라우드 보안 그룹과 병행 사용 |
'시스템(Linux)' 카테고리의 다른 글
| /run/user/1000 알람에 대해 알아보겠습니다. (1) | 2026.03.11 |
|---|---|
| Linux kill vs pkill 정리 (0) | 2026.03.10 |
| ripgrep(rg) 에 대해 알아보겠습니다. (0) | 2026.03.01 |
| 리눅스 루트킷(Linux Rootkit) 에 대해 알아보겠습니다. (0) | 2025.12.19 |
| blkid 명령어에 대해 알아보겠습니다. (0) | 2025.12.18 |