상세 컨텐츠

본문 제목

Fail2ban 설정 가이드 실무 적용과 문제 해결 완벽 정리

리눅스 정보실

by 고지존 2025. 8. 11. 12:05

본문

반응형

이 글은 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가 로그 파일을 잃지 않도록 logtargetlogpath 설정을 점검하세요.
  • 장기 차단이 필요한 경우 중앙의 SIEM과 연동해 이벤트 기반으로 수동 검토 후 IP를 영구 블랙리스트에 추가하세요.
  • 분산 공격 대응은 단일 호스트 차단만으로 부족하므로 upstream(네트워크 레벨) 차단이나 CDN 방어를 병행하세요.

10. 요약

Fail2ban은 로그 기반 자동 차단의 표준 도구입니다. 올바른 logpath, 정확한 필터, 그리고 nftables/ipset와의 연동을 통해 대규모 환경에서도 안정적으로 동작합니다. 정규식과 액션을 신중히 설계하고, 테스트·모니터링을 습관화하세요.

작성자 주: 본 문서는 보안강화와 방어를 목적으로 작성되었습니다. 악의적 사용을 유도하지 않습니다.

반응형

관련글 더보기