얼마나 많이 들어오나
OCI 서버는 공인 IP가 직접 노출돼 있어서 설치 직후부터 SSH 로그인 시도가 들어온다. auth.log를 열어봤다가 깜짝 놀랐다.
sudo grep "Failed password" /var/log/auth.log | tail -20

Invalid user admin, Invalid user guest, Invalid user root 같은 로그가 수분 간격으로 끊임없이 들어오고 있었다. 전 세계 봇들이 24시간 SSH 로그인을 시도하는 것이다. 방치하면 언젠가 뚫릴 수 있고, 서버 리소스도 낭비된다.
Fail2ban이란?
로그 파일을 모니터링하다가 일정 횟수 이상 로그인에 실패한 IP를 자동으로 방화벽에서 차단하는 도구다.
- 설치만 해도 SSH 기본 보호 즉시 적용
- iptables와 연동해서 IP 차단
- 일정 시간 후 자동으로 차단 해제
- SSH 외에도 Nginx, Apache 등 다양한 서비스 보호 가능
설치
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo systemctl status fail2ban

설치 직후부터 기본 SSH 보호가 바로 적용된다.
설정
Fail2ban 기본 설정은 /etc/fail2ban/jail.conf에 있지만 이 파일은 직접 수정하지 않는다. 업데이트 시 덮어씌워질 수 있기 때문이다. 대신 jail.local을 만들어서 오버라이드한다.
sudo vi /etc/fail2ban/jail.local
[DEFAULT]
# 차단에서 제외할 IP (내 Tailscale IP 등)
ignoreip = 127.0.0.1/8 ::1
# 차단 지속 시간: 기본 10분 → 1시간
bantime = 3600
# 몇 초 동안 실패 횟수를 카운트할지
findtime = 600
# 몇 번 실패하면 차단할지
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
| 항목 | 기본값 | 변경값 | 설명 |
|---|---|---|---|
| bantime | 600초 | 3600초 | 차단 지속 시간 |
| findtime | 600초 | 600초 | 실패 횟수 카운트 기간 |
| maxretry | 5회 | 5회 | 차단 기준 실패 횟수 |
설정 적용:
sudo systemctl restart fail2ban
⚠️ 설정 전에 반드시 자신의 IP를
ignoreip에 추가해둘 것. 실수로 자신의 IP가 차단되면 SSH 접속이 불가능해진다.
반복 공격자 장기 차단 (recidive)
같은 IP가 여러 번 차단됐다 풀리면 또 시도하는 경우가 있다. recidive jail을 활성화하면 반복 공격자를 장기간 차단할 수 있다.
jail.local에 추가:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime = 604800 ; 7일
findtime = 86400 ; 1일
maxretry = 3 ; 하루에 3번 차단되면 7일 차단
Nginx 보호
OCI에서 Nginx 리버스 프록시를 운영하고 있으니 HTTP 레벨 공격도 막을 수 있다.
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
차단 현황 확인
# 전체 jail 상태
sudo fail2ban-client status
# SSH jail 상세
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1284
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 12
|- Total banned: 87
`- Banned IP list: 185.156.73.233 139.19.117.130 ...

실시간 로그 확인:
sudo tail -f /var/log/fail2ban.log
2026-03-29 22:48:33 INFO [sshd] Ban 193.46.255.86
2026-03-29 22:52:33 INFO [sshd] Ban 185.156.73.233
2026-03-29 23:01:15 INFO [sshd] Ban 139.19.117.130
IP 수동 차단/해제
# 수동 차단
sudo fail2ban-client set sshd banip 1.2.3.4
# 차단 해제 (내 IP 실수로 차단됐을 때)
sudo fail2ban-client set sshd unbanip 1.2.3.4
차단 목록 확인
이후 시간이 조금 지나고 확인해보니, 정상적으로 잘 차단하고 있는 걸 확인할 수 있다.

설치 전후 비교
| 설치 전 | 설치 후 | |
|---|---|---|
| auth.log | Failed password 수천 줄 | 차단된 IP는 시도 자체가 안 됨 |
| 서버 부하 | SSH 시도로 인한 불필요한 부하 | 최소화 |
| 보안 | 브루트포스 공격에 노출 | 자동 차단 |
정리
클라우드 서버를 운영한다면 Fail2ban은 선택이 아니라 필수다. 설치 자체는 5분이면 되고, 기본 설정만으로도 대부분의 브루트포스 공격을 막을 수 있다. recidive jail까지 설정해두면 반복 공격자를 장기간 차단해서 더욱 안전하게 운영할 수 있다.
다음 편에서는 서비스가 늘어나면서 기존 SSL 인증서에 서브도메인을 추가하는 방법을 다룬다.