// Security · Fail2ban · SSH · BruteForce · Linux · iptables
서버를 열어두는 순간 공격은 이미 시작된다 — Fail2ban으로 SSH 무차별 대입 공격 완전 차단하기
서버를 열면 공격도 시작된다
SSH 포트(22번)를 열어놓은 서버는 인터넷에 노출되는 순간부터 자동화된 봇의 공격 대상이 된다. 전 세계 수천 대의 봇이 24시간 무작위로 아이디·패스워드를 대입하는 Brute Force Attack(무차별 대입 공격)을 쉴 새 없이 시도한다.
계정이 탈취되면 서버가 악성코드 유포지나 DDoS 봇넷으로 악용될 수 있다. Fail2ban은 이 공격을 자동으로 감지하고 차단하는 오픈소스 방어 도구다.
⚠️
실제 공격 빈도
신규 서버를 오픈하고
sudo cat /var/log/auth.log | grep "Failed"를 실행해보면 수백~수천 건의 실패 기록이 이미 쌓여 있는 경우가 많다. 방어 없이 서버를 운영하는 건 현관문 열어두고 외출하는 것과 같다.1. Fail2ban이란?
Fail2ban은 로그 파일을 실시간 모니터링하다가 의심스러운 반복 시도가 감지되면 iptables 방화벽 정책을 자동으로 변경해 해당 IP를 차단하는 보안 도구다.
💡
한 줄 정의
로그를 감시하다 규칙 위반 IP를 감지하면 iptables로 자동 차단 → 일정 시간 후 자동 해제하는 동적 방화벽 도구
Fail2ban 동작 흐름
공격자 IP → SSH 로그인 반복 실패
↓
/var/log/auth.log 에 실패 기록 누적
↓
Fail2ban 필터가 패턴 감지 (maxretry 초과)
↓
iptables에 차단 규칙 자동 추가 (bantime 동안)
↓
bantime 만료 후 자동 차단 해제
Fail2ban이 보호할 수 있는 서비스
SSH│원격 접속 무차별 대입 공격 차단 (가장 많이 사용)
Apache / Nginx│웹 서버 스캐닝, 악성 봇 차단
FTP / SMTP│파일 전송·메일 서버 인증 공격 차단
WordPress│wp-login.php 무차별 대입 공격 차단
2. Fail2ban 설치
패키지 매니저로 간단하게 설치할 수 있다. OS 계열에 맞게 선택하면 된다.
# Debian / Ubuntu 계열
$ sudo apt-get install fail2ban
# RHEL / Rocky Linux / CentOS 계열
$ sudo dnf install epel-release -y
$ sudo dnf install fail2ban -y
# 설정 작업 전 서비스 중지
$ sudo systemctl stop fail2ban
$ sudo systemctl status fail2ban
3. jail.local 설정 파일 생성
Fail2ban의 기본 설정 파일은 jail.conf다. 이 파일을 직접 수정하면 패키지 업데이트 시 설정이 초기화될 수 있다. 반드시 jail.local을 따로 만들어서 관리해야 한다.
# jail.conf를 jail.local로 복사 (업데이트해도 로컬 설정 유지됨)
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# jail.local 편집
$ sudo vi /etc/fail2ban/jail.local
💡
jail.conf vs jail.local 우선순위
Fail2ban은 시작 시
jail.conf를 먼저 읽고, jail.local로 덮어쓴다. jail.local에 설정한 값이 항상 우선 적용된다.4. SSH 보호 정책 설정 — [sshd]
jail.local에서 [sshd] 섹션을 찾아 아래와 같이 설정한다.
[sshd]
enabled = true
port = ssh
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 3
bantime = 600
각 옵션 상세 설명
💡
Rocky Linux / CentOS는 logpath가 다르다
Debian/Ubuntu 계열은
/var/log/auth.log, Rocky Linux/CentOS 계열은 /var/log/secure를 사용한다. 잘못된 경로를 지정하면 Fail2ban이 로그를 읽지 못해 차단이 동작하지 않는다.5. Fail2ban 재시작 및 상태 확인
# Fail2ban 재시작
$ sudo systemctl restart fail2ban
$ sudo systemctl enable fail2ban
# sshd jail 상태 확인
$ sudo fail2ban-client status sshd
정상적으로 동작하면 아래와 같이 현재 차단된 IP 목록과 총 차단 횟수를 확인할 수 있다.
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 148
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 23
`- Banned IP list: 192.168.x.x
6. 유용한 운영 명령어 모음
# 전체 jail 목록 및 상태 확인
$ sudo fail2ban-client status
# 특정 IP 수동 차단
$ sudo fail2ban-client set sshd banip 1.2.3.4
# 특정 IP 차단 해제 (실수로 내 IP가 차단됐을 때)
$ sudo fail2ban-client set sshd unbanip 1.2.3.4
# 현재 iptables에 적용된 Fail2ban 차단 규칙 확인
$ sudo iptables -L f2b-sshd -n --line-numbers
# Fail2ban 로그 실시간 모니터링
$ sudo tail -f /var/log/fail2ban.log
⚠️
내 IP가 차단되면?
VPN 사용 중이거나 여러 번 오타를 냈다가 본인 IP가 차단될 수 있다. 이 경우 서버 콘솔(AWS EC2의 경우 Session Manager, VPS의 경우 웹 콘솔)로 접속해서
unbanip 명령어로 해제하면 된다. 이를 대비해 ignoreip에 본인 IP를 등록해두는 것을 강력히 권장한다.7. 고급 설정 — ignoreip & findtime
기본 설정 외에도 실무에서 유용한 옵션들이 있다. [DEFAULT] 섹션에 전역으로 적용하거나 각 jail에 개별 적용할 수 있다.
[DEFAULT]
# 절대 차단하지 않을 IP (본인 IP, 사무실 IP 등록 권장)
ignoreip = 127.0.0.1/8 ::1 본인의.공인IP
# 실패 횟수를 누적할 시간 범위 (초)
# 아래 설정은 600초(10분) 내에 maxretry 초과 시 차단
findtime = 600
# 차단 시간 (초). -1은 영구 차단
bantime = 3600
# 허용 실패 횟수
maxretry = 5
// 정리
설치 → jail.local 복사 → [sshd] 설정 → 재시작 → 상태 확인
서버를 열었다면 Fail2ban은 선택이 아니라 필수다.
서버를 열었다면 Fail2ban은 선택이 아니라 필수다.
Tags:
#Fail2ban
#SSH
#Linux
#서버보안
#iptables
#BruteForce
#AWS
#보안설정