ShadowFortress: 내가 수백 개의 IP 블록리스트를 하나의 즉시 사용 가능한 파일로 합치는 방법

발행: (2026년 3월 31일 AM 02:29 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

실제 문제

CISO로서 나는 알려진 악성 IP(명령·제어 서버, 스캐너, 스팸 릴레이, 공격적으로 사용되는 Tor 종료 노드 등)와의 인바운드·아웃바운드 트래픽을 차단해야 합니다.

시장은 유료 솔루션(FortiGuard Threat Intelligence 피드, CrowdSec 등)을 제공하지만, 정말 간단하게 원시 IP 파일 형태로 제공되고, 무료이며 자동으로 유지되는 것은 없습니다.

공개 소스(blocklist.de, feodotracker, spamhaus 등)가 존재하지만, 이를 제대로 집계하려면 실제 작업이 필요합니다: 중복 제거, 빈도 기반 선택, 오탐 제외.

ShadowFortress가 하는 일

ShadowFortress는 오픈 소스 IP 차단 목록 집계기로서 다음을 수행합니다:

  • 여러 공개 차단 목록 소스를 수집합니다
  • 모든 IP 주소를 중복 제거합니다
  • 가장 많이 중복되는 IP(가장 많은 소스에 나타나는 IP)를 선택합니다
  • 합법적인 IP 대역에 대한 오탐을 방지하기 위해 개인 화이트리스트를 적용합니다
  • 두 개의 별도 파일을 생성합니다: 하나는 인바운드 필터링용, 다른 하나는 아웃바운드 필터링용
  • GitHub Actions를 통해 6시간마다 자동 업데이트합니다

최대 100 000 IP 주소까지 제한하며, 이는 대부분의 네트워크 장비가 성능 저하 없이 처리할 수 있는 용량과 일치합니다.

Generated files

파일목적
blacklist_inbound.txt악성 IP로부터의 들어오는 연결 차단
blacklist_outbound.txt손상된 대상에 대한 나가는 연결 차단
STATS.md통계: 볼륨, 추세, 활성 소스

파일은 raw GitHub URL을 통해 직접 제공되며, 이를 통해 스크립트나 네트워크 솔루션에서 쉽게 사용할 수 있습니다.

통합 예시

FortiGate (주 사용 사례)

# From FortiGate CLI
config firewall address
    edit "ShadowFortress-Inbound"
        set type iprange
        set comment "ShadowFortress blocklist - inbound"
    next
end

External Block List (EBL)를 사용한 깔끔한 통합을 위해서는 파일의 원시 URL을 직접 지정하십시오 — FortiOS가 주기적으로 자동 갱신합니다.

iptables / ipset

# Fetch the list and load it into ipset
curl -s https://raw.githubusercontent.com/Grujowmi/ShadowFortress/main/blacklist_inbound.txt | \
while read ip; do
    ipset add blocklist_inbound "$ip" 2>/dev/null
done

nftables

table inet filter {
    set blocklist_inbound {
        type ipv4_addr
        flags interval
        # blacklist_inbound.txt에서 스크립트로 채우기
    }

    chain input {
        type filter hook input priority 0;
        ip saddr @blocklist_inbound drop
    }
}

Cisco (ACL)

목록을 파이썬 스크립트로 파싱하여 ACL을 생성하거나, Ansible과 같은 구성 관리 솔루션에 통합할 수 있습니다.

왜 중복 기반 선택인가?

전체 소스의 union을 취하는 대신 (이는 수백만 개의 IP와 많은 노이즈를 생성할 수 있음), ShadowFortress는 the highest number of distinct sources에 걸쳐 나타나는 IP를 선택합니다.

그 이유: 10개의 서로 다른 소스에 모두 등재된 IP는 하나의 소스에만 등재되어 오래되었거나 관리가 부실할 수 있는 IP보다 실제로 악성일 가능성이 훨씬 높습니다.

결과: shorter, more accurate list with fewer false positives.

개인 화이트리스트

파일이 생성되기 전에 화이트리스트 메커니즘이 적용됩니다. 이는 내 환경에서 오탐을 일으킬 수 있는 IP 범위(CDN, 정식 클라우드 서비스, 비즈니스 파트너 등)를 제외합니다.

이 화이트리스트는 공개되지 않으며, 각 사용자는 자신의 상황에 맞게 제외 항목을 관리해야 합니다. 동일한 로직을 구현하려면 최종 파일을 배포하기 전에 허용 목록과 일치하는 모든 IP를 필터링하십시오.

라이선스 및 기여

이 프로젝트는 GNU GPL v3 라이선스를 따릅니다 (LICENSE 파일에서 GPL‑v3임을 확인할 수 있습니다).

기여를 환영합니다: 새로운 소스 추가, 버그 수정, 중복 제거 파이프라인 개선 등.

github.com/Grujowmi/ShadowFortress

이 프로젝트는 NIS2 및 HDS 준수 요구 사항이 적용되는 의료 환경의 실제 운영 필요성에서 시작되었습니다. 다른 장비와 통합한 경험이 있다면 이슈를 열거나 댓글을 남겨 주세요.

0 조회
Back to Blog

관련 글

더 보기 »

[Boost]

코드가 주변 시스템을 앞설 때 Joachim Zeelmaekers 3월 30일 softwareengineering ai 댓글 추가 6분 읽기