Home Linux AWS Cloud Docker Python AI
클릭하여 터미널 활성화

리눅스 서버 SSH 보안 강화 | Fail2ban으로 무차별 대입 공격 방어하기

// 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파일 전송·메일 서버 인증 공격 차단
WordPresswp-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
각 옵션 상세 설명
옵션 설명
enabled true 이 jail 규칙을 활성화. false로 하면 비활성화
port ssh (또는 22) 모니터링할 포트. SSH 기본 포트를 변경했다면 해당 번호 입력
action iptables[...] 차단 방식. iptables로 해당 IP를 TCP 레벨에서 차단
logpath /var/log/auth.log 감시할 로그 파일 경로. Rocky/CentOS는 /var/log/secure
maxretry 3 허용 실패 횟수. 이 횟수를 초과하면 즉시 차단
bantime 600 (초) 차단 지속 시간(초). 600 = 10분, -1 = 영구 차단
💡
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
bantime 권장 설정 기준
600 (10분) 일반 테스트 환경, 실수로 내 IP 차단될 리스크 최소화
3600 (1시간) 운영 서버 권장. 대부분의 자동화 봇 스캐닝 차단에 충분
86400 (1일) 보안 강화. 반복 공격 IP 하루 동안 완전 차단
-1 (영구) 알려진 악성 IP 영구 차단. 수동 해제 필요
// 정리
설치 → jail.local 복사 → [sshd] 설정 → 재시작 → 상태 확인
서버를 열었다면 Fail2ban은 선택이 아니라 필수다.
Tags: #Fail2ban #SSH #Linux #서버보안 #iptables #BruteForce #AWS #보안설정