Fail2ban으로 SSH 무차별 공격 실시간 차단 — 1분 설치 가이드 (2026)

VPS에 SSH 포트를 열어두셨다면, 지금 이 순간에도 누군가가 비밀번호를 대입하고 있습니다. 농담이 아닙니다. SSH 포트 22번을 그대로 둔 서버의 인증 로그를 열어보면, 매분마다 수십 개의 IP가 root, admin, test 같은 계정으로 로그인을 시도하는 게 보입니다. 하나 막으면 끝이 아니라 계속 옵니다. Fail2ban은 이 패턴을 자동으로 감지해서 차단합니다.

왜 SSH 무차별 공격이 문제인가

SSH 무차별 공격(brute force)은 비밀번호를 통째로 맞춰보는 공격입니다. root 계정 비밀번호가 ‘qwer1234’나 ‘password123’처럼 단순하다면 맞출 확률이 꽤 됩니다. 한 번 뚫리면 서버 전체를 빼앗깁니다. 암호화폐 채굴러, 스팸 릴레이, 다른 서버를 공격하는 드론 노드로 쓰입니다. 한낱 VPS 한 대가 전체 데이터센터 IP 대역의 평판을 깎아먹기도 합니다.

공격이 끊임없이 들어오는 이유는 자동화 봇넷 때문입니다. 전 세계 SSH 포트를 스캔하는 봇들이 24시간 대기하고 있다가, 열린 포트를 발견하면 비밀번호 사전(dictionary)을 돌리기 시작합니다. 사람이 직접 하는 게 아니라 기계가 합니다. 그래서 로그가 금방 수만 줄씩 쌓입니다.

Fail2ban이 하는 일

Fail2ban은 로그를 실시간으로 감시하다가, 정해진 횟수 이상 인증에 실패한 IP를 자동으로 차단(firewall 차단)합니다. ‘너 5번 틀렸어, 나가’라고 하는 호텔 도어맨 같은 역할입니다.

설치 한 번이면 끝입니다. 기본값으로 5회 실패 시 10분간 IP를 차단합니다. 차단 기록은 fail2ban-client 명령어로 바로 확인할 수 있고, 영구 차단이나 차단 횟수 조정도 설정 파일 한 줄이면 됩니다.

설치 1분 컷

Debian, Ubuntu 계열에서 설치는 한 줄입니다.

# 설치 한 줄
sudo apt update
sudo apt install fail2ban

설치하면 기본적으로 sshd jail이 활성화됩니다. 즉시 작동하기 시작합니다. 별도 설정 없이도 5회 실패 시 10분 차단이 기본값으로 들어갑니다. 차단 현황을 확인해 봅니다.

# sshd jail 상태 확인
sudo fail2ban-client status sshd

# 출력 예시
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed: 3
# |  |- Total failed:     47
# |  `- File list:        /var/log/auth.log
# `- Actions
#    |- Currently banned: 2
#    |- Total banned:     18
#    `- Banned IP list:   192.168.x.x 10.x.x.x

Currently banned가 0이어도, Total banned 숫자를 보면 설치 직후부터 차단이 들어가고 있다는 걸 알 수 있습니다. Total failed가 수백 단위로 올라가는 걸 보면 공격이 얼마나 빈번한지 체감할 수 있습니다.

영구 차단으로 바꾸기

기본 10분 차단은 봇이 돌아오면 또 시도한다는 뜻입니다. 영구 차단으로 바꾸려면 설정 파일을 만듭니다. /etc/fail2ban/jail.local을 직접 만지면 됩니다. jail.conf는 건드리지 마세요. 패키지 업데이트 시 덮어씌워집니다.

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
maxretry = 5
bantime = -1        # -1 = 영구 차단
findtime = 600      # 10분 안에 5회 실패 시

bantime = -1은 영구 차단을 의미합니다. 10분짜리가 아니라 아예 블록리스트에 올라갑니다. 너무 가혹하게 느껴지면 1주일(604800)이나 1달(2592000) 정도로 잡아도 충분합니다. 설정을 바꾼 뒤에는 반드시 재시작합니다.

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd    # 설정 반영 확인

꿀팁: SSH 포트 변경이 더 효과적

Fail2ban보다 더 효과가 좋은 게 SSH 포트 변경입니다. 기본 22번에서 2222번이나 22022 같은 번호로 바꾸면 공격량 자체가 90% 이상 줄어듭니다. 봇들이 기본적으로 22번만 스캔하기 때문입니다. 포트 스캐너를 돌리는 정교한 공격자는 결국 찾겠지만, 무차별 공격 봇의 대부분은 22번만 보고 지나갑니다.

# /etc/ssh/sshd_config 에서
Port 2222

# 변경 후 재시작
sudo systemctl restart sshd

# 주의: 방화벽에서 새 포트를 먼저 열어두지 않으면
# 본인도 접속 불가 (매우 중요)
sudo ufw allow 2222/tcp

Fail2ban과 포트 변경, 두 개를 같이 쓰면 거의 끝입니다. 거기에 SSH 키 인증으로 비밀번호 로그인을 아예 막아버리면 더 완벽합니다. 키 파일이 없으면 접속 자체가 안 되니 무차별 공격은 의미를 잃습니다.

주의점: 내 IP가 차단되는 사고

가장 흔한 사고가 본인 IP가 차단되는 것입니다. 비밀번호를 여러 번 틀리면 본인 서버에 들어가지 못하게 됩니다. 이걸 방지하려면 ignoreip 설정으로 내 IP를 화이트리스트에 넣어둡니다. 고정 IP가 아니라면 VPN이나 점프 서버를 쓰는 편이 안전합니다.

# /etc/fail2ban/jail.local 최상단 [DEFAULT] 섹션에
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.42    # 본인 IP 추가

차단된 IP를 수동으로 풀려면 unban 명령을 씁니다.

sudo fail2ban-client set sshd unbanip 1.2.3.4

설정 요약

항목 기본값 추천
maxretry 5회 3~5회
bantime 10분 -1 (영구) 또는 1주일
findtime 10분 10분
ignoreip localhost 본인 IP 추가
SSH 포트 22 2222 등으로 변경
인증 방식 비밀번호 SSH 키 전용

반복 공격자 영구 추방: recidive jail

10분 차단을 당한 IP가 또 들어옵니다. 봇이니까 당연하죠. 차단이 풀리면 다시 비밀번호를 대입합니다. 이런 재범자를 자동으로 더 길게 차단하는 jail이 recidive입니다. recidive는 다른 jail에서 차단된 IP 기록을 모니터링하다가, 일정 횟수 이상 반복 차단되면 하루에서 일주일, 심하면 영구 차단으로 escalates합니다.

# /etc/fail2ban/jail.local 에 추가
[recidive]
enabled = true
maxretry = 3          # 3번 차단되면
bantime = 604800      # 1주일 영구 차단
findtime = 86400      # 24시간 내 3회 반복 시

recidive를 켜면 일반 sshd jail에서 3번 차단된 IP가 자동으로 1주일 차단으로 넘어갑니다. 대부분의 자동화 봇은 여기서 사라집니다. 다만 영구 차단은 신중해야 합니다. 실수로 비밀번호를 여러 번 틀린 정상 사용자도 걸릴 수 있으니, 본인 IP는 반드시 ignoreip로 제외하세요.

SSH 키 인증으로 비밀번호 공격 무효화

Fail2ban이 1차 방어선이라면, SSH 키 인증은 근본적 해결책입니다. 비밀번호 로그인을 아예 막아버리면 무차별 공격 자체가 의미가 없어집니다. 아무리 비밀번호를 대입해도 서버가 거부합니다.

# 클라이언트에서 키 생성
ssh-keygen -t ed25519 -C "my-server-key"

# 공개키를 서버에 복사
ssh-copy-id user@your-server-ip

# 서버에서 비밀번호 로그인 비활성화
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes

sudo systemctl restart sshd

키 인증으로 전환한 뒤 auth.log를 보면 여전히 공격 시도는 들어오지만, 전부 Permission denied (publickey)로 막힙니다. Fail2ban은 이 시도도 잡아내서 IP를 차단하므로, 로그 크기까지 줄어듭니다. 두 개를 같이 쓰면 VPS SSH 보안은 사실상 완성입니다.

더 깊은 SSH 보안 가이드는 SSH 세션 유지(tmux) 가이드Fail2ban 공식 문서를 참고하세요.

Fail2ban 상태를 한눈에 보려면 fail2ban-client status를 인자 없이 실행하세요. 활성화된 전체 jail 목록과 각 jail의 차단 현황이 정리되어 나옵니다. 모니터링 도구(Grafana, Datadog)와 연동하면 차단 추이를 시각화해서 이상 징후를 더 빨리 발견할 수 있습니다. VPS 보안 운영에서 가장 중요한 건 설치가 아니라 지속적인 모니터링과 대응입니다. Fail2ban 로그를 정기적으로 확인하는 습관을 들이세요.

VPS 보안은 Fail2ban 한 줄로 시작합니다. 지금 바로 설치하고 auth.log를 확인해 보세요. 어젯밤 사이에 얼마나 많은 IP가 비밀번호를 대입했는지 보면 깜짝 놀라실 겁니다. VPS 실전 보안 팁을 매주 받아보시려면 구독해 주세요.

관련 글