fail2ban SSH 차단 설정 5분 완성 — jail.local 복붙 예제
/var/log/auth.log에 Failed password가 초 단위로 쏟아지고 있나요? 개념 설명은 나중으로 미루고, 지금 당장 복붙해서 SSH 무차별 대입(brute force)을 자동 차단하는 실전 레시피부터 갑니다. 순서대로 따라 하면 5분 안에 끝납니다.
1. 지금 공격당하고 있나? — 30초 진단
먼저 규모부터 확인하세요. 아래 세 줄이면 지금 상황이 보입니다.
# 실패한 로그인 시도 총 횟수
grep "Failed password" /var/log/auth.log | wc -l
# 최근 실패한 로그인 시도(IP·계정 확인)
lastb | head
# systemd journal 기반 서버라면
journalctl -u ssh | grep "Failed" | tail -n 20wc -l 결과가 수백~수천이면 이미 봇넷 스캔 표적입니다. 2026년 현재도 노출된 22번 포트를 노리는 크리덴셜 스터핑과 자동화 스캔은 계속 늘고 있어요. 바로 방어막을 겁니다.
2. 설치 (OS 분기)
| 단계 | Ubuntu / Debian | CentOS / RHEL |
|---|---|---|
| 설치 | sudo apt update && sudo apt install -y fail2ban | sudo dnf install -y epel-release && sudo dnf install -y fail2ban |
| 시작 | sudo systemctl start fail2ban | sudo systemctl start fail2ban |
| 부팅 시 자동 실행 | sudo systemctl enable fail2ban | sudo systemctl enable fail2ban |
| 설치 확인 | fail2ban-client version | fail2ban-client version |
설치 직후에도 기본 [DEFAULT] 설정으로 동작하지만, 우리가 원하는 값은 아래 jail.local로 확실히 덮어씁니다.
3. jail.local 복붙 템플릿
/etc/fail2ban/jail.local 파일을 새로 만들고 아래를 그대로 붙여넣으세요. jail.conf는 절대 직접 수정하지 말고 항상 jail.local로 오버라이드합니다.
[DEFAULT]
# 화이트리스트: 절대 내 IP를 빼먹지 마세요 (자기 차단 사고 1순위 원인)
# 127.0.0.1/8 ::1 = 로컬/IPv6 루프백, 그 뒤에 내 고정IP·사무실 대역 추가
ignoreip = 127.0.0.1/8 ::1 203.0.113.45 198.51.100.0/24
# 몇 번 실패하면 차단할지
maxretry = 5
# 이 시간 안에 maxretry 도달 시 차단 (10분)
findtime = 10m
# 차단 유지 시간 (1시간). 영구 차단은 -1
bantime = 1h
# bantime = -1 ← 영구 차단하려면 이 줄로 교체
[sshd]
enabled = true
port = ssh
# --- 로그 경로 / 백엔드 (OS별로 하나만 선택) ---
# Ubuntu/Debian (기존 파일 로그):
logpath = /var/log/auth.log
backend = auto
# CentOS/RHEL 또는 systemd journal 전환 서버라면 아래처럼:
# backend = systemd
# (backend = systemd 사용 시 logpath 줄은 지워도 됩니다)각 파라미터가 실제로 무엇을 바꾸는지 정리하면:
| 파라미터 | 값 예시 | 하는 일 |
|---|---|---|
maxretry | 5 | findtime 안에 5번 실패하면 차단 |
findtime | 10m | 실패 횟수를 세는 시간 창 |
bantime | 1h / -1 | 차단 유지 시간, -1은 영구 |
ignoreip | IP·대역 | 절대 차단하지 않을 화이트리스트 |
backend | auto/systemd | 로그를 파일에서 읽을지 journal에서 읽을지 |
실무 팁: IPv6로 SSH를 노출한 서버가 늘면서
ignoreip에::1을 넣지 않아 IPv6 루프백 관련 오탐을 겪는 사례가 종종 있습니다. 위 템플릿처럼::1을 기본 포함해 두세요. 저는 신규 VPS를 띄우면 SSH 접속 전에 클라우드 웹콘솔에서 이 파일부터 넣습니다. 그래야 실수로 잠겨도 콘솔로 복구할 수 있으니까요.
4. 적용하고 차단 상태 확인
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
# jail 전체 목록 확인 (sshd가 보여야 정상)
sudo fail2ban-client status
# sshd jail 상세 — 지금 누가 차단됐는지
sudo fail2ban-client status sshd
# 차단 이벤트 실시간 모니터링
sudo tail -f /var/log/fail2ban.logfail2ban-client status sshd 정상 출력 예시는 이렇게 나옵니다.
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1274
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 2
|- Total banned: 37
`- Banned IP list: 185.220.101.44 45.148.10.92Banned IP list에 IP가 찍히기 시작하면 방어가 살아있다는 뜻입니다.
5. 오탐 복구와 "내 IP 잠김" 탈출 — 배포 전 체크
가장 흔한 사고는 자기 자신을 차단하는 것입니다. 침착하게 복구하세요.
정상 세션이 살아있다면 즉시 unban:
sudo fail2ban-client set sshd unbanip 203.0.113.45SSH가 완전히 막혔다면 (진짜 잠긴 상황):
- 클라우드 콘솔의 웹 VNC / 시리얼 콘솔(AWS EC2 Serial Console, GCP/네이버클라우드 웹콘솔 등)로 접속
sudo fail2ban-client set sshd unbanip <내IP>로 즉시 해제jail.local의ignoreip에 내 IP·사무실 대역을 추가하고sudo systemctl restart fail2ban- 다시 SSH로 정상 접속되는지 확인
배포 전 반드시 점검할 안전장치 3가지:
- ✅
ignoreip에 내 고정IP와127.0.0.1/8 ::1이 들어있는가 - ✅
bantime을 처음부터-1(영구)로 두지 않았는가 (초기엔1h권장) - ✅ 콘솔/복구모드 접속 경로를 미리 확보했는가
마지막으로, fail2ban은 어디까지나 임시 방어막입니다. 궁극적으로는 키 기반 인증(비밀번호 로그인 비활성화)과 SSH 포트 변경을 병행하고, 가능하면 backend = systemd로 journal 기반 로그를 사용하는 방향으로 정리하는 걸 권합니다.
참고: 공식 문서
이 글에서 다루는 동작·설정·에러의 1차 출처는 다음 공식 문서입니다. 버전별 옵션과 정확한 동작은 여기서 확인하세요.
자주 묻는 질문 (FAQ)
Q. fail2ban 적용 후에도 auth.log에 계속 실패 로그가 쌓여요. 실패한 건가요?
A. 정상입니다. fail2ban은 실패 로그를 "읽어서" 임계치를 넘긴 IP만 차단하므로, 차단 전까지의 시도는 로그에 남습니다. fail2ban-client status sshd의 Total banned가 늘어나면 정상 동작 중입니다.
Q. bantime을 영구(-1)로 걸어도 되나요?
A. 됩니다. 다만 초기엔 1h로 운영하며 오탐이 없는지 확인한 뒤 영구로 올리세요. 처음부터 -1이면 본인 IP를 실수로 차단했을 때 자동 해제가 안 됩니다.
Q. CentOS인데 logpath 대신 systemd를 쓰라는 게 무슨 의미인가요?
A. 최근 배포판은 로그를 파일 대신 systemd journal에 기록합니다. [sshd]에 backend = systemd를 지정하면 fail2ban이 journal에서 직접 실패 로그를 읽어 별도 logpath 없이 동작합니다.
이 글은 AI 에이전트가 자료 조사와 1차 초안 작성을 담당하고, 사람 편집자가 사실관계·출처·톤과 맥락을 검토한 뒤 발행했습니다. 환경(OS·버전)에 따라 결과가 다를 수 있으니 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.
댓글
첫 번째 댓글을 남겨보세요.