얼마나 많이 들어오나

OCI 서버는 공인 IP가 직접 노출돼 있어서 설치 직후부터 SSH 로그인 시도가 들어온다. auth.log를 열어봤다가 깜짝 놀랐다.

sudo grep "Failed password" /var/log/auth.log | tail -20

auth.log에 Invalid user 로그가 수천 줄 쌓인 화면

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

fail2ban active (running) 상태

설치 직후부터 기본 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 ...

fail2ban-client status sshd 결과

실시간 로그 확인:

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

차단 목록 확인

이후 시간이 조금 지나고 확인해보니, 정상적으로 잘 차단하고 있는 걸 확인할 수 있다. fail2ban-client log 결과

설치 전후 비교

설치 전 설치 후
auth.log Failed password 수천 줄 차단된 IP는 시도 자체가 안 됨
서버 부하 SSH 시도로 인한 불필요한 부하 최소화
보안 브루트포스 공격에 노출 자동 차단

정리

클라우드 서버를 운영한다면 Fail2ban은 선택이 아니라 필수다. 설치 자체는 5분이면 되고, 기본 설정만으로도 대부분의 브루트포스 공격을 막을 수 있다. recidive jail까지 설정해두면 반복 공격자를 장기간 차단해서 더욱 안전하게 운영할 수 있다.

다음 편에서는 서비스가 늘어나면서 기존 SSL 인증서에 서브도메인을 추가하는 방법을 다룬다.