2026년 6월 15일 Cloudflare가 Cloudforce One 구독자에게 지난 7일간 위협 활동 IP를 WAF 규칙에서 매칭하는 cf.intel.ip.* 필드를 열었습니다. 어떤 IP가 DDoS·WAF 데이터셋에서 공격자로 관찰됐는지, 어느 나라를 주로 노렸는지 같은 정보를 규칙 조건으로 쓸 수 있습니다.

Enterprise 요금제 이야기지만 개념은 같습니다. IP 평판 기반 차단은 자체 서버에서도 오픈소스 도구로 충분히 구현할 수 있습니다. 이 글에서는 실무에서 검증된 세 도구(fail2ban·CrowdSec·IP reputation 리스트)를 정리합니다.


왜 IP 평판이 효과적인가

같은 공격자 IP가 여러 사이트를 순회합니다. 그래서 한 곳에서 관찰된 악성 IP는 다른 곳에서도 위험할 확률이 높습니다. Cloudflare의 강점은 전 세계 트래픽에서 그 신호를 실시간으로 수집한다는 것. 우리 자체 서버에는 그 규모가 없지만, 아래 세 방식으로 유사한 효과를 냅니다.

  1. 자체 로그에서 실시간 학습 (fail2ban) — 우리 서버 로그에서 공격자를 즉시 차단.
  2. 커뮤니티 공유 신호 (CrowdSec) — 오픈소스 사용자 커뮤니티가 신호를 공유.
  3. 외부 IP 평판 피드 (Firehol·Spamhaus·Emerging Threats) — 무료로 공개된 큐레이션 목록.

셋을 조합하면 상용 위협 인텔에 근접한 방어가 나옵니다.


1) fail2ban — 자체 학습 즉시 차단

가장 오래된 오픈소스 IP 차단 도구. 로그에서 공격 패턴을 발견하면 즉시 iptables/nftables에 차단 규칙을 추가.

설치

apt install -y fail2ban

SSH 무차별 대입 차단 (기본)

# /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

3분 안에 3회 실패 → 1시간 차단.

Nginx 403·404 폭탄 차단

공격자가 존재하지 않는 URL을 다량 요청해서 정보 수집하는 패턴.

# /etc/fail2ban/jail.d/nginx.local
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 30
findtime = 60
bantime = 3600
# /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = ^<HOST> .* "GET .*" 404
ignoreregex =

1분에 404 30건 넘으면 1시간 차단. 임계값은 사이트 특성에 맞춰 조정.

WordPress·특정 앱 로그인 실패 차단

[wp-login]
enabled = true
filter = wp-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 300
bantime = 7200
# /etc/fail2ban/filter.d/wp-login.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login\.php.*" 200

관리 명령

fail2ban-client status
fail2ban-client status sshd
fail2ban-client unban 203.0.113.50

2) CrowdSec — 커뮤니티 공유 IP 평판

fail2ban의 현대적 재해석. 오픈소스지만 커뮤니티 사용자가 로컬에서 탐지한 IP를 익명 신호로 공유하고, 그 큐레이션된 IP 목록을 각자 로컬 방어에 반영합니다.

  • 초당 수천 건 신호가 커뮤니티 인스턴스에서 들어옴.
  • 큐레이션(false positive 필터링) 후 공유 리스트에 등록.
  • 각 서버가 이 리스트를 pull해서 로컬 차단.

설치

curl -s https://install.crowdsec.net | bash
apt install -y crowdsec crowdsec-firewall-bouncer-iptables

시나리오(공격 패턴) 설치

cscli collections install crowdsecurity/nginx
cscli collections install crowdsecurity/sshd
cscli collections install crowdsecurity/wordpress

상태 확인

cscli metrics
cscli decisions list
cscli alerts list

대시보드

CrowdSec는 로컬 대시보드(Metabase 기반)도 제공. 자체 서버에서 어떤 공격이 얼마나 들어오는지 시각화.

cscli dashboard setup

3) 외부 IP 평판 피드

무료 큐레이션 목록을 iptables에 직접 반영.

Firehol 목록

# Firehol Level 1 (안전한 목록만)
wget https://iplists.firehol.org/files/firehol_level1.netset -O /etc/firehol/level1.txt

# iptables로 차단
iptables -N FIREHOL
for cidr in $(cat /etc/firehol/level1.txt | grep -v '^#'); do
    iptables -A FIREHOL -s $cidr -j DROP
done
iptables -I INPUT -j FIREHOL

Firehol Level 1은 오탐이 거의 없는 안전한 목록. Level 2·3은 공격적이지만 오탐 위험 증가.

Spamhaus DROP·EDROP

메일 서버 관리자가 자주 쓰는 것. Advertised 공격 대역.

wget https://www.spamhaus.org/drop/drop.txt
# 파싱해서 iptables에 반영

Emerging Threats compromised IPs

wget https://rules.emergingthreats.net/blockrules/compromised-ips.txt

이 세 리스트를 cron으로 매일 pull → iptables 갱신.

# /etc/cron.daily/update-blocklists.sh
#!/bin/bash
LIST=/etc/blocklist/current.txt
TMP=$(mktemp)

curl -s https://iplists.firehol.org/files/firehol_level1.netset >> $TMP
curl -s https://www.spamhaus.org/drop/drop.txt | awk '{print $1}' >> $TMP
curl -s https://rules.emergingthreats.net/blockrules/compromised-ips.txt >> $TMP

sort -u $TMP > $LIST

# ipset 사용
ipset destroy blocklist 2>/dev/null
ipset create blocklist hash:net
for cidr in $(grep -v '^#' $LIST); do
    ipset add blocklist $cidr 2>/dev/null
done

ipset은 iptables보다 훨씬 빠른 목록 매칭이 가능.

iptables -I INPUT -m set --match-set blocklist src -j DROP

세 도구 조합 전략

각 도구 강점이 다르니 조합이 최선.

  • fail2ban: 실시간 자체 로그 감지 (SSH·앱 로그인).
  • CrowdSec: 커뮤니티 공유 위협 (봇넷·스캐너).
  • 외부 IP 평판 피드: 알려진 악성 대역 (선제 차단).

우선순위.

  1. IP 평판 피드로 이미 알려진 악성 대역 선제 차단(0단계).
  2. CrowdSec로 커뮤니티 신호 반영(1단계).
  3. fail2ban으로 우리 서버에 대한 특정 공격 즉시 대응(2단계).

각각 다른 iptables/nftables 체인으로 로그 남기면 나중에 어느 층에서 걸렸는지 분석 가능.


Cloudflare vs 자체 조합 — 어느 쪽이 나은가

  • Cloudflare: 엣지에서 걸러줌 → 원본 서버 부하 없음. 신호 규모 압도적. 단점: 요금·룰 세밀화 한계.
  • 자체 조합: 세밀한 로컬 튜닝. 오탐도 우리가 관리. Cloudforce One 급의 신호는 없음.

다층 방어가 정답. Cloudflare 앞단 + 자체 서버 뒷단. 어느 하나가 뚫려도 다른 하나가 잡을 확률이 높음.


오탐 관리 — 실무의 절반

IP 평판 차단의 최대 리스크는 오탐입니다. 실제 사용자가 갑자기 접속 못 하는 상황.

  • 회사·학교·공공 와이파이 CGNAT: 한 IP 뒤에 수백 명. 한 명이 잘못했다고 IP 차단하면 전원 아웃.
  • 클라우드 VM: AWS·GCP IP 대역은 봇넷도 쓰지만 정상 봇·CI도 씀.
  • 국가별 대역: 특정 국가 통째 차단은 실제로 자주 부작용.

대응.

  • whitelist 필수. 자기 IP·회사·CDN IP 대역.
  • 차단 시간을 짧게 시작(30분)해서 잘못 걸린 사람이 오래 못 들어가는 상황 방지.
  • 알림을 관리 채널로 (텔레그램).
  • 로그를 3~7일 보존해서 사후 검증 가능.

마무리

위협 인텔리전스 기반 방어는 상용 서비스에서 자주 얘기하지만, 자체 서버에서도 오픈소스로 상당 부분 구현 가능합니다. fail2ban·CrowdSec·외부 피드 조합이면 대다수 자동화 공격은 걸러집니다.

TCP-80.NET의 일본 VPS·전용서버에서 이런 방어 세팅이 필요하신 경우 @tcp80net 텔레그램으로 문의 주시면 됩니다.


출처 (Source)

이 글은 아래 Cloudflare 공식 changelog를 참고해 tcp-80.net 청중 관점에서 재구성·번역·확장했습니다. 자체 서버 IP 평판 방어(fail2ban·CrowdSec·Firehol·Spamhaus·EmergingThreats·ipset·오탐 관리)는 원문에 없는 자체 추가 내용입니다.

Cloudforce One 필드·정책은 시점에 따라 다를 수 있으니 최신 정보는 원문 및 Cloudflare Enterprise 담당자를 통해 확인하시기 바랍니다.