- infra/cloudflare.md 전면 재작성: zone 6개(actions/anvil/inouter/ironclad/keepanker/servidor) 전수, DNS 레코드 zone별 핵심, Workers 9개 + 라우트, Turnstile 위젯 8개. dead reference (nas.inouter.com / *.actions.it.com → actions.b-cdn.net), servidor.it.com orphan zone, 사설 IP 노출, CF proxy on/off 함의 등 특이사항 정리. 옛 jarvis/n8n/vault → actions.b-cdn.net 기록 폐기. - services/bunnycdn-security.md: 5개 풀존 전수표, 17개 호스트네임 인벤토리, 미들웨어 64811 attach 매트릭스, bouncer.py 동기화 흐름. cfb-manager 가 BunnyCDN 미들웨어를 갱신한다는 옛 오기록 정정 (cfb-manager 는 CF Worker bouncer 전용). - 두 문서 모두 Outline 감사 doc 51b963c3 링크.
7.2 KiB
title, updated, tags
| title | updated | tags | |||||
|---|---|---|---|---|---|---|---|
| BunnyCDN 엣지 보안 (CrowdSec + 국가 차단) | 2026-04-10 |
|
2026-04-10 전수 감사 (Outline
agent-qnadoc51b963c3-b251-48b5-a57a-a2305959c470) 결과 반영. 5개 풀존, 17개 호스트네임, 미들웨어 64811 attach 매트릭스를 모두 정본화.
구성
- 엣지 스크립트:
crowdsec-bouncer-middleware(ID: 64811, ScriptType=2 Middleware) - 연결된 Pull Zone (2026-04-09 실측): iron-kr (5555227), iron-jp (5555247) —
MiddlewareScriptId: 64811. 두 풀존 모두 동일 미들웨어 공유. - 미장착 풀존: iron-git (5584382, gitea.inouter.com), iron-kr-waf (5555224, SafeLine 자체 보호), i-gate (5557897, 미사용)
- 관리·동기화: jp1
infra-tool컨테이너/opt/crowdsec-bouncer/bouncer.py(3분 delta + 매시 full sync). cfb-manager 는 Cloudflare Worker bouncer 관리이며 BunnyCDN 미들웨어와 무관. - 소스: crowdsec-safeline bloom filter (FNV-1a 임베디드 BLOOM_B64) + Cloudflare Turnstile 캡차
옛 메모의 풀존 ID
5316471 (inouter),5330178 (actions),5554681 (waf-kr)는 현 계정에 더 이상 존재하지 않음. iron-kr / iron-jp / iron-kr-waf 로 통합·이전됨.
동작 순서
요청 → BunnyCDN 엣지
1. 국가 차단 (Cdn-RequestCountryCode 헤더)
- 차단 시 403 반환
2. CrowdSec bloom filter (악성 IP 판별)
- bloom filter hit → 캡차 또는 403
- cfb-manager가 주기적으로 bloom filter 업데이트
3. 캡차 (Cloudflare Turnstile)
- bloom hit된 IP에게 캡차 제시
- 통과 시 4시간 허용 (DB + 쿠키)
4. 정상 → Origin으로 전달
차단 국가
US, CA, GB, DE, FR, IT, ES, NL, BE, AT, CH, SE, NO, DK, FI, PL, CZ, PT, IE, RO, HU, BG, HR, SK, SI, LT, LV, EE, LU, MT, CY, GR, IS, UA, RU, BY
(북미 + 유럽 + 구소련)
주의사항
- BunnyCDN Traffic Manager 국가 차단은 사용하지 않음 — Let's Encrypt 검증 및 Origin Shield fetch를 막아서 Free SSL 발급 실패 + 500 에러 유발
- 엣지 스크립트의 국가 차단은
Cdn-RequestCountryCode헤더 기반 → CDN 내부 요청(Let's Encrypt, Origin Shield)에는 이 헤더가 없으므로 영향 없음 - Free SSL 자동 발급/갱신 정상 동작
Pull Zone 전수 (2026-04-10)
| ID | 이름 | OriginUrl | Middleware | Smart Cache | IgnoreQS | BlockNoRef | 비고 |
|---|---|---|---|---|---|---|---|
| 5555227 | iron-kr | https://220.120.65.245 |
64811 | ✅ | true | true | 메인 inouter.com 계열 |
| 5555247 | iron-jp | https://172.233.93.180 |
64811 | ✅ | false ⚠ | true | anvil.it.com 계열 |
| 5555224 | iron-kr-waf | https://220.120.65.245:9443 |
null | ❌ | true | true | SafeLine WAF 다운스트림 보호 |
| 5584382 | iron-git | https://220.120.65.245 |
null | ❌ | true | false ⚠ | git smart HTTP 보호 우회 (의도) |
| 5557897 | i-gate | https://172.233.93.180 |
null | ❌ | true | true | idle 슬롯, 0 byte |
공통: EnableLogging: true, EnableWebSockets: true (max 500), EnableGeoZone*: true (전 지역), BlockedCountries: [], BlockedIps: [], EdgeRules: [] (Edge Rules 미사용 — 모든 분기는 미들웨어 코드 안), OriginType: 0 (URL), VerifyOriginSSL: false, EnableOriginShield: false. OptimizerEnabled: iron-kr / iron-jp 만 true.
호스트네임 인벤토리 (17개)
| Pull Zone | Hostname | 시스템? | TLS | ForceSSL |
|---|---|---|---|---|
| iron-kr | iron-kr.b-cdn.net |
✅ | ✅ | false |
| iron-kr | actions.it.com |
— | ✅ | false |
| iron-kr | n8n.inouter.com |
— | ✅ | false |
| iron-kr | jarvis.inouter.com |
— | ✅ | false |
| iron-kr | telegram-webhook.inouter.com |
— | ✅ | false |
| iron-kr | vault.inouter.com |
— | ✅ | false |
| iron-kr | outline.inouter.com |
— | ✅ | false |
| iron-jp | iron-jp.b-cdn.net |
✅ | ✅ | false |
| iron-jp | anvil.it.com |
— | ✅ | false |
| iron-jp | n8n.anvil.it.com |
— | ✅ | false |
| iron-jp | tg.anvil.it.com |
— | ✅ | false |
| iron-jp | linode.actions.it.com |
— | ✅ | false |
| iron-kr-waf | iron-kr-waf.b-cdn.net |
✅ | ✅ | false |
| iron-kr-waf | juiceshop.keepanker.cv |
— | ✅ | false |
| iron-git | iron-git.b-cdn.net |
✅ | ✅ | false |
| iron-git | gitea.inouter.com |
— | ✅ | false |
| i-gate | i-gate.b-cdn.net |
✅ | ✅ | false |
합계: 사용자 호스트 12 + 시스템 호스트 5 = 17. 모두 HasCertificate: true (Let's Encrypt 자동 발급/갱신). Bunny API 의 list/get 응답에는 인증서 만료일이 노출되지 않음 → 만료 임박 모니터링은 능동 외부 cert 체크 또는 Bunny 대시보드 알림에 의존.
Edge Script / Middleware attach 매트릭스
| Script ID | 이름 | Type | Attached pullzones | 비고 |
|---|---|---|---|---|
| 64811 | crowdsec-bouncer-middleware |
2 (Middleware) | iron-kr (5555227), iron-jp (5555247) | 두 풀존 동일 미들웨어 공유 |
| (none) | — | — | iron-kr-waf, iron-git, i-gate | iron-git 의도적 우회 (git pack 바이너리 보호 불가), iron-kr-waf 는 다운스트림 SafeLine, i-gate idle |
CrowdSec Bouncer 동기화 구조
CrowdSec LAPI (jp1 Incus, 10.253.100.240:8080) → 악성 IP decision
↓
infra-tool 컨테이너 (jp1) /opt/crowdsec-bouncer/bouncer.py
├ 3분 delta sync
└ 매시 full sync
↓
bloom filter (FNV-1a) base64 → BunnyCDN compute API
→ Edge Script 64811 코드의 BLOOM_B64/BLOOM_VERSION 상수 정규식 교체
→ publish
↓
엣지 스크립트가 요청마다 client IP 를 bloom filter 로 체크
→ hit → Turnstile 캡차 (verified 4h 쿠키)
→ miss → origin 통과
주의:
cfb-manager(K8sdefault/cfb-manager) 는 Cloudflare Worker bouncer 관리 API 이며 BunnyCDN 미들웨어 64811 와는 무관. 옛 메모 혼동 정정.
특이사항 (2026-04-10 감사)
- i-gate (5557897): 시스템 호스트네임 1개만, 0 byte 트래픽. 빈 슬롯 — 제거 또는 명확한 용도 부여 필요.
- iron-kr / iron-jp
IgnoreQueryStrings불일치: 같은 미들웨어 64811 공유인데 정책이 다름 (true vs false). iron-jp 트래픽 미미해 영향 작지만 통일 권장. - Turnstile sitekey gap: 미들웨어 64811 의
TURNSTILE_SITE_KEY는inouter.comzone managed 위젯 단일 키 →actions.it.com,anvil.it.com,*.b-cdn.net호스트에서 ban 발동 시 캡챠 위젯 로드 실패. zone별 dispatcher TODO. - 옛 메모의 풀존 ID
5316471 (inouter),5330178 (actions),5554681 (waf-kr)는 현 계정에 더 이상 존재하지 않음. 그런데nas.inouter.com과*.actions.it.comCloudflare DNS 가 아직actions.b-cdn.net을 가리키는 dead reference 가 남아 있음 — cloudflare 정리 필요.
참조
- 전수 감사 정본 (대화 로그): Outline
agent-qnadoc51b963c3-b251-48b5-a57a-a2305959c470(2026-04-10) - 워크스페이스 런북:
~/syn/bunnycdn/README.md - API 레퍼런스: bunnycdn
관련 문서
- bunnycdn — BunnyCDN API 레퍼런스
- crowdsec-safeline — CrowdSec 및 SafeLine WAF 설정
- cloudflare — Cloudflare DNS/CDN (Turnstile 캡차 키 관리)