fail2ban 설정으로 SSH 무차별 대입 공격 막기 (설치, jail.local, 차단 해제)
인터넷에 열려 있는 서버라면 지금 이 순간에도 누군가 SSH 비밀번호를 맞혀 보고 있을 가능성이 높다. 이런 무차별 대입 공격을 자동으로 막아 주는 도구가 fail2ban이다. 이 글에서는 설치부터 fail2ban 설정 파일 작성, 차단 상태 확인과 해제까지 정리한다. SSH 보안의 첫 단계인 SSH 키 인증 설정을 먼저 해 두면 효과가 훨씬 크다.

내 서버에 들어오는 공격 확인하기
먼저 실제로 얼마나 많은 로그인 시도가 있는지 보자. 공개 IP를 가진 서버라면 하루에 수백, 수천 건이 찍혀 있어도 이상하지 않다.
# Ubuntu / Debian
sudo grep "Failed password" /var/log/auth.log | wc -l
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
# Rocky / RHEL 계열
sudo grep "Failed password" /var/log/secure | wc -l
# journald 로 보기
sudo journalctl -u ssh --since today | grep -i "failed"로그 보는 방법은 journalctl 사용법에 자세히 정리해 두었다.
fail2ban 동작 원리
fail2ban은 로그 파일을 계속 읽다가, 정해진 시간(findtime) 안에 같은 IP에서 실패가 일정 횟수(maxretry) 이상 나오면 방화벽 규칙을 추가해 그 IP를 일정 시간(bantime) 동안 막는다. 감시 대상(서비스)별 설정 묶음을 jail이라고 부른다.
| 설정 | 뜻 | 예시 |
|---|---|---|
maxretry | 허용 실패 횟수 | 5 |
findtime | 실패를 세는 시간 범위 | 10m |
bantime | 차단 유지 시간 | 1h |
ignoreip | 절대 차단하지 않을 IP | 127.0.0.1/8 내 IP |
fail2ban 설치
# Ubuntu / Debian
sudo apt update
sudo apt install fail2ban
# Rocky / RHEL 계열 (EPEL 저장소 필요)
sudo dnf install epel-release
sudo dnf install fail2ban
sudo systemctl enable --now fail2ban서비스 관리 명령은 리눅스 서비스 관리(systemctl) 글을 참고하자.
fail2ban 설정 파일 작성
/etc/fail2ban/jail.conf는 패키지를 업데이트하면 덮어써지므로 직접 고치지 않는다. 대신 jail.local 파일을 만들어 바꾸고 싶은 값만 적는다.
sudo vi /etc/fail2ban/jail.local
[DEFAULT]
# 내 사무실 IP 등은 절대 차단하지 않기
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
# 다시 걸리는 IP는 차단 시간을 점점 늘리기
bantime.increment = true
[sshd]
enabled = true
# SSH 포트를 바꿨다면 그 번호로
port = ssh
# auth.log 가 없는 배포판은 아래 주석 해제
# backend = systemdSSH 포트를 바꿨다면 port에 그 번호를 적어야 한다. 포트 변경은 SSH 포트 변경 방법에 정리했다. Debian 12처럼 /var/log/auth.log 없이 journald만 쓰는 시스템에서는 backend = systemd를 켜야 로그를 읽을 수 있다.
# 설정 확인 후 재시작
sudo fail2ban-client -t
sudo systemctl restart fail2banufw를 쓰고 있다면
fail2ban은 기본적으로 iptables나 nftables에 직접 규칙을 넣는다. ufw로 방화벽을 관리하고 있다면 [DEFAULT]에 banaction = ufw를 넣어 차단도 ufw 규칙으로 보이게 할 수 있다. 방화벽 기본은 리눅스 방화벽 설정 방법에 있다.
fail2ban 설정 확인과 차단 해제
# 켜진 jail 목록
sudo fail2ban-client status
# sshd jail 상세: 실패 횟수, 차단된 IP 목록
sudo fail2ban-client status sshd
# 특정 IP 차단 해제
sudo fail2ban-client set sshd unbanip 198.51.100.23
# 직접 차단
sudo fail2ban-client set sshd banip 198.51.100.23
# fail2ban 동작 로그
sudo tail -f /var/log/fail2ban.log나를 막아 버렸다면
비밀번호를 여러 번 틀려 내 IP가 차단되면 SSH 접속 자체가 안 된다. 다른 IP(휴대폰 테더링 등)나 클라우드 콘솔의 웹 터미널로 들어가 unbanip로 풀면 된다. 그래서 자주 쓰는 고정 IP는 처음부터 ignoreip에 넣어 두는 것이 좋다. 접속 문제를 점검하는 순서는 SSH 접속 안될 때 확인할 것에 있다.
SSH 키, 방화벽, fail2ban을 포함한 서버 기본 보안 순서는 리눅스 서버 초기 세팅 체크리스트에서 한눈에 볼 수 있다.
fail2ban 설정 정리
fail2ban은 키 인증과 비밀번호 로그인 차단을 대신하는 도구가 아니라, 그 위에 한 겹 더 두는 안전장치다. 키 인증으로 문을 잠그고, fail2ban으로 문을 두드리는 사람을 쫓아내고, 방화벽으로 필요한 포트만 여는 세 겹 구성이면 기본적인 서버 보안은 충분하다. 더 많은 jail 예시는 fail2ban 공식 저장소에서 볼 수 있다.
첫 댓글을 남겨보세요