fail2ban SSH 보호
SSH 로그인 실패가 반복될 때 해당 IP를 자동으로 방화벽에서 차단한다.
설치 후 /etc/fail2ban/jail.local만 작성하면 된다.
설치
# Amazon Linux 2023 / RHEL 계열
sudo dnf install -y fail2ban
# Ubuntu / Debian 계열
sudo apt install -y fail2ban
# 서비스 등록 및 시작
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
jail.local 설정
jail.conf는 패키지 업데이트 시 덮어쓰여질 수 있으므로 반드시 jail.local에 작성한다.
# /etc/fail2ban/jail.local
[DEFAULT]
# 차단 기준
bantime = 1h # 차단 유지 시간 (1h, 24h, -1 = 영구 차단)
findtime = 10m # 이 시간 내에 maxretry 초과 시 차단
maxretry = 5 # 허용 실패 횟수
# 차단 방식: iptables-multiport (기본값)
banaction = iptables-multiport
# 이메일 알림 (사용 시 설정)
# destemail = admin@example.com
# sendername = Fail2Ban
# action = %(action_mwl)s
[sshd]
enabled = true
port = ssh # 기본 22번, 변경한 경우 실제 포트 번호 입력 (예: 2222)
logpath = %(sshd_log)s
maxretry = 3 # SSH는 더 엄격하게 3회로 설정
bantime = 24h
주요 파라미터 설명
| 파라미터 | 설명 | 예시 |
|---|---|---|
bantime | 차단 유지 시간. -1은 영구 차단 | 1h, 24h, -1 |
findtime | 실패 횟수를 집계하는 시간 범위 | 10m, 1h |
maxretry | findtime 안에 허용되는 최대 실패 횟수 | 3, 5 |
port | 모니터링할 포트. 기본 SSH 포트가 아닌 경우 지정 | ssh, 2222 |
logpath | 모니터링할 로그 파일 경로 | %(sshd_log)s |
적용 방법
# 설정 적용 (재시작)
sudo systemctl restart fail2ban
# 설정 파일 문법 검사
sudo fail2ban-client -t
상태 확인 명령어
# 전체 jail 상태 확인
sudo fail2ban-client status
# SSH jail 상태 확인 (차단된 IP 목록 포함)
sudo fail2ban-client status sshd
# 출력 예시:
# Status for the jail: sshd
# |- Filter
# | |- Currently failed: 2
# | |- Total failed: 47
# | `- File list: /var/log/secure
# `- Actions
# |- Currently banned: 1
# |- Total banned: 3
# `- Banned IP list: 203.0.113.42
차단 IP 수동 해제
실수로 자신의 IP가 차단된 경우 서버 콘솔에서 직접 해제한다.
# 특정 IP 차단 해제
sudo fail2ban-client set sshd unbanip 203.0.113.42
# iptables에서 직접 확인
sudo iptables -L -n | grep 203.0.113.42
특정 IP 영구 허용 (화이트리스트)
사무실 IP 등 차단되면 안 되는 IP는 ignoreip에 등록한다.
# /etc/fail2ban/jail.local
[DEFAULT]
# 공백 또는 줄바꿈으로 구분
ignoreip = 127.0.0.1/8 ::1
203.0.113.10 # 사무실 고정 IP
sudo systemctl restart fail2ban
로그 확인
# fail2ban 동작 로그
sudo tail -f /var/log/fail2ban.log
# 차단 이벤트만 필터링
sudo grep "Ban " /var/log/fail2ban.log | tail -20