Fail2ban SSH 무차별 대입 방어: VPS 보안 강화 완벽 가이드 (2026)

VPS를 열어두면 SSH 공격 시도가 계속 쌓인다

클라우드 VPS(Vultr, DigitalOcean, Hetzner 등)에 SSH(22번 포트)를 열어두면, 인터넷 자동화 봇들이 곧 무차별 대입(brute force) 공격을 시작합니다. /var/log/auth.log(Ubuntu 최신 이미지는 sudo journalctl -u ssh)를 확인해 보면 실패한 로그인 시도가 계속 기록되어 있을 것입니다.

Fail2ban SSH 무차별 대입 방어: VPS 보안 강화 완벽 가이드 (2026)
사진: West Virginia National Guard / flickr (PDM)

비밀번호를 복잡하게 설정했다 하더라도, 이 로그 노이즈는 서버 자원을 소모합니다. Fail2ban은 로그를 모니터링하다가 실패 IP를 자동으로 방화벽에서 차단하는 널리 쓰이는 SSH 보안 도구입니다.

1. Fail2ban 개념 — 로그 탐지 + 방화벽 연동

Fail2ban은 서비스 로그를 실시간으로 감시하다가, 설정한 횟수만큼 인증 실패가 발생하면 해당 IP를 방화벽(iptables/nftables/ufw) 규칙으로 자동 차단합니다. 일정 시간(bantime)이 지나면 자동으로 차단이 해제됩니다.

핵심 구성 요소:

  • jail — 모니터링 대상 서비스 단위 (sshd, nginx-botsearch 등)
  • filter — 로그에서 실패 패턴을 찾는 정규식
  • action — 차단 수행 방식 (iptables, ufw 등)

2. 설치 및 기본 동작

Ubuntu/Debian에서 패키지로 설치합니다:

sudo apt update && sudo apt install -y fail2ban

설치 직후 sshd jail이 기본 활성화됩니다 (Debian 계열). 상태를 확인:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status

출력에 sshd jail이 보이면 정상입니다. jail.conf는 기본 설정 파일이지만 이 파일은 직접 수정하지 말고 jail.local을 만들어 덮어씁니다 — 패키지 업데이트 시 jail.conf는 초기화됩니다.

3. jail.local 커스터마이징 — bantime/findtime/maxretry — 요약

3. jail.local 커스터마이징 — bantime/findtime/maxretry

차단 정책을 커스텀하려면 /etc/fail2ban/jail.local을 만듭니다:

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = systemd

[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 3600
  • bantime — 차단 지속 시간 (초). 3600 = 1시간
  • findtime — 이 시간(초) 안에 maxretry 횟수만큼 실패하면 차단
  • maxretry — 허용 실패 횟수. 초과 시 차단

변경 후 재시작:

sudo systemctl restart fail2ban

4. SSH jail 심화 — 포트 변경, 영구 차단

SSH 포트를 기본 22번이 아닌 다른 포트(예: 2222)로 변경했다면 jail 설정에 반영해야 합니다:

[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600

반복 공격자를 영구 차단하려면 recidive jail을 활성화합니다 — 짧은 시간 안에 여러 번 차단당한 IP를 장기(주 단위) 차단합니다:

[recidive]
enabled = true
maxretry = 3
bantime = 604800
findtime = 86400

5. 다른 서비스 확장 — nginx-botsearch, recidive

Fail2ban은 SSH 외에도 웹서버 로그를 감시할 수 있습니다. nginx에서 존재하지 않는 파일/디렉토리를 반복 스캔하는 봇을 차단:

[nginx-botsearch]
enabled = true
maxretry = 2
bantime = 7200

WordPress 로그인 무차별 대입도 filter를 직접 만들어 차단할 수 있습니다(Fail2ban 저장소의 filter.d에는 WordPress용 기본 필터가 없습니다). 커스텀 filter는 /etc/fail2ban/filter.d/에 정규식 파일로 추가합니다.

6. 차단 로그 확인 — fail2ban-client status, unban — 요약

6. 차단 로그 확인 — fail2ban-client status, unban

현재 차단된 IP와 통계를 확인:

# 전체 jail 목록
sudo fail2ban-client status

# sshd jail 상세 (차단 IP 목록)
sudo fail2ban-client status sshd

# 수동으로 IP 차단 해제
sudo fail2ban-client unban 1.2.3.4

차단 이력은 Fail2ban 로그에서 확인:

sudo tail -f /var/log/fail2ban.log

7. 운영 팁 — ignoreip, DB 영속화, ufw 연동

ignoreip로 자신의 IP를 화이트리스트에 넣으면 실수로 차단당하는 것을 막을 수 있습니다:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.50

차단 이력은 기본적으로 SQLite DB(/var/lib/fail2ban/fail2ban.sqlite3)에 저장되어 재시작 후에도 이어집니다. 보관 기간은 /etc/fail2ban/fail2ban.local의 [Definition]에서 dbpurgeage로 정합니다(기본 1일):

[Definition]
dbpurgeage = 86400

ufw 연동: Fail2ban이 iptables 대신 ufw를 사용하게 할 수 있습니다. /etc/fail2ban/action.d/ufw.conf는 기본 제공되므로, jail 설정에서 banaction = ufw로 지정하면 됩니다.

마무리 — 보안 자동화가 정답이다

Fail2ban은 VPS 보안의 기본기입니다. 설정 한 번이면 로그를 지켜보다 실패 IP를 자동 차단하므로, 더 이상 auth.log를 수동으로 감시할 필요가 없습니다. ufw 방화벽 + SSH 키 인증 + Fail2ban 조합은 VPS 보안의 기본기입니다.

이것으로 VPS/DevOps 시리즈의 서비스 관리(systemd)와 보안(Fail2ban) 핵심을 마쳤습니다. 시리즈 전체 가이드는 채널을 구독해서 확인하세요.

자주 묻는 질문 (FAQ)

Q1. jail.conf를 직접 고치면 안 되나요?

jail.conf는 패키지를 업데이트하면 초기화됩니다. /etc/fail2ban/jail.local을 새로 만들어 필요한 항목만 덮어쓰는 것이 정석입니다.

Q2. bantime, findtime, maxretry는 각각 무슨 뜻인가요?

findtime(초) 안에 maxretry 횟수만큼 인증에 실패하면 해당 IP를 bantime(초)만큼 차단합니다. findtime 600, maxretry 3, bantime 3600은 10분 안에 3번 실패하면 1시간 차단한다는 뜻입니다.

Q3. 실수로 내 IP가 차단되면 어떻게 하나요?

sudo fail2ban-client unban 1.2.3.4로 즉시 해제할 수 있습니다. 미리 [DEFAULT]의 ignoreip에 자신의 IP를 넣어 화이트리스트로 두면 이런 상황을 예방할 수 있습니다.

Q4. SSH 포트를 바꿨는데 차단이 동작하지 않습니다.

jail 설정에도 바뀐 포트를 반영해야 합니다. [sshd] 섹션의 port 값을 실제 사용 중인 포트(예: 2222)로 지정한 뒤 fail2ban을 재시작하세요.

관련 글


자세한 가이드: SSH 무차별 대입 공격 5초만에 차단 — Fail2ban 설치 가이드 2026