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

이 글은 핵심 개념과 실제 적용 방법을 단계별로 안내합니다. 본문을 통해 독자는 실무에 바로 적용할 수 있는 구체적인 설정법과 확실한 해결책을 얻게 됩니다.

초보자부터 전문가까지 누구나 쉽게 따라 할 수 있도록 구성되었습니다. 핵심 원리를 이해하고 실제 환경에 적용해 보세요.

각 단계별로 상세한 설명과 예시 코드가 포함되어 있습니다. 이를 통해 시행착오를 줄이고 빠르게 목표를 달성할 수 있습니다.

VPS를 열어둔 지 하루 만에 SSH 공격이 수만 건 쌓인다 무엇인가요?

클라우드 VPS(Vultr, DigitalOcean, Hetzner 등)에 SSH(22번 포트)를 열어두면, 인터넷 자동화 봇들이 몇 분 안에 무차별 대입(brute force) 공격을 시작합니다. /var/log/auth.log를 확인해 보면 분 단위로 수십 건의 실패한 로그인 시도가 기록되어 있을 것입니다.

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

비밀번호를 복잡하게 설정했다 하더라도, 이 로그 노이즈는 서버 자원을 소모하고 영점공격(zero-day)에 대한 노출면을 넓힙니다. 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 로그인 무차별 대입도 [wordpress] filter로 차단할 수 있습니다. 커스텀 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

영속 DB를 켜면 재시작 시 차단 목록이 유지됩니다:

[DEFAULT]
dbpurgeage = 86400

ufw 연동: Fail2ban이 iptables 대신 ufw를 사용하게 할 수 있습니다. /etc/fail2ban/action.d/ufw.conf를 만들어 action을 지정합니다.

마무리 — 보안 자동화가 정답이다 무엇인가요?

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

이것으로 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을 재시작하세요.

관련 글