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 실전 보안 팁을 매주 받아보시려면 구독해 주세요.



















