VPS를 열어둔 지 하루 만에 SSH 공격이 수만 건 쌓인다
클라우드 VPS(Vultr, DigitalOcean, Hetzner 등)에 SSH(22번 포트)를 열어두면, 인터넷 자동화 봇들이 몇 분 안에 무차별 대입(brute force) 공격을 시작합니다. /var/log/auth.log를 확인해 보면 분 단위로 수십 건의 실패한 로그인 시도가 기록되어 있을 것입니다.
비밀번호를 복잡하게 설정했다 하더라도, 이 로그 노이즈는 서버 자원을 소모하고 영점공격(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
차단 정책을 커스텀하려면 /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
현재 차단된 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) 핵심을 마쳤습니다. 시리즈 전체 가이드는 채널을 구독해서 확인하세요.



















