[서버보안] 우분투 Nginx + Fail2Ban 완벽 연동: 무한 공격 IP 자동 차단하기

서버를 운영하다 보면 1초에 수십 번씩 접속을 시도하는 악성 봇이나, 비밀번호를 뚫으려는 무차별 대입 공격(Brute Force)을 마주하게 됩니다.

Nginx 자체적으로 속도 제한(limit_req)을 걸어 503 에러를 띄울 수는 있지만, 공격자가 쉬었다가 다시 들어오면 막을 방법이 없습니다. 이때 필요한 것이 바로 Fail2Ban입니다.

Fail2Ban이란?

서버 로그(Log)를 실시간으로 감시하다가, 특정 패턴(예: 503 에러 반복, 로그인 실패 반복)이 보이면 방화벽(UFW)을 이용해 해당 IP를 영구적으로 차단해버리는 보안 도구입니다.

서버 부하가 거의 없으면서도 방어 효과는 확실하기 때문에 리눅스 서버 필수 설치 프로그램으로 꼽힙니다.


1. Fail2Ban 설치하기

우분투 터미널에서 아래 명령어를 입력해 설치합니다.

Bash

sudo apt update
sudo apt install fail2ban -y

2. 설정 파일 생성 (jail.local)

Fail2Ban은 원본 설정 파일(jail.conf)을 건드리지 않고, jail.local 파일을 새로 만들어 적용하는 것이 원칙입니다.

Bash

sudo nano /etc/fail2ban/jail.local

파일이 열리면 아래 내용을 통째로 복사해서 붙여넣으세요. (SSH 방어와 Nginx 공격 방어가 모두 포함된 설정입니다.)

Ini, TOML

[DEFAULT]
# 차단하지 않을 안전한 IP (내 IP나 로컬호스트 127.0.0.1)
ignoreip = 127.0.0.1/8 ::1

# 차단 시간 (단위: 초, 3600 = 1시간)
bantime = 3600

# 감시 기간 (단위: 초, 600초 동안)
findtime = 600

# 허용 횟수 (5번 실수하면 차단)
maxretry = 5

# --- [ SSH 방어 ] ---
# 22번 포트(SSH) 접속 시도 반복 차단
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 5

# --- [ Nginx 속도 제한 방어 ] ---
# Nginx에서 limit_req(503 에러)에 걸린 IP를 감지해서 차단
[nginx-limit-req]
enabled = true
filter  = nginx-limit-req
action  = ufw[name=Nginx, port=http, protocol=tcp]
logpath = /var/log/nginx/error.log
findtime = 600
maxretry = 5
bantime = 86400  
# (하루 동안 차단. 봇이니까 세게 막아도 됩니다.)

# --- [ Nginx 404 스캔 방어 ] ---
# 없는 페이지(404)를 계속 찾는 스캐너 봇 차단
[nginx-botsearch]
enabled = true
filter  = nginx-botsearch
action  = ufw[name=Nginx, port=http, protocol=tcp]
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 3600
  • nginx-limit-req: Nginx 설정에서 속도 제한(limit_req)을 걸어두었을 경우, 이를 어기고 계속 접속하는 봇을 잡아내어 차단합니다. (Nginx와 Fail2Ban의 환상의 짝꿍 설정)

3. 적용 및 서비스 재시작

설정 파일을 저장(Ctrl+O, Enter)하고 닫은(Ctrl+X) 뒤, 서비스를 재시작합니다.

Bash

sudo service fail2ban restart

4. 작동 상태 확인

Fail2Ban이 잘 감시하고 있는지 확인하려면 아래 명령어를 사용합니다.

Bash

# 전체 감옥(Jail) 리스트 확인
sudo fail2ban-client status

# 특정 감옥(예: nginx-limit-req)의 차단 현황 확인
sudo fail2ban-client status nginx-limit-req
  • Currently banned: 현재 감옥에 갇힌(차단된) IP 개수

  • Banned IP list: 실제 차단된 IP 목록


🚨 실수로 차단된 IP 해제하는 법 (Unban)

테스트를 하다가 내 IP가 차단되거나, 정상적인 사용자가 차단되었을 때는 수동으로 풀어줘야 합니다.

1. 어떤 감옥(Jail)에 갇혔는지 확인

먼저 status 명령어로 차단된 IP가 어디에 들어있는지 확인합니다.

Bash

sudo fail2ban-client status nginx-limit-req

2. 차단 해제 명령어

set [감옥이름] unbanip [IP주소] 형식을 사용합니다.

예시 1) Nginx 속도 제한 감옥에서 해제할 때

Bash

sudo fail2ban-client set nginx-limit-req unbanip 123.123.123.123

예시 2) SSH 감옥에서 해제할 때

Bash

sudo fail2ban-client set sshd unbanip 123.123.123.123

이제 IP를 바꿔가며 1초에 5번씩 공격하는 봇이 들어와도, Nginx가 1차로 에러를 뱉고 -> Fail2Ban이 로그를 감지해 방화벽으로 영구 차단하는 완벽한 보안 시스템이 구축되었습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤