--- title: BunnyCDN 엣지 보안 (Shield + Rate Limit + 대역폭 한도) updated: 2026-04-26 bouncer 단일화로 Edge Script 64811 + bloom filter + Turnstile inouter-bunny 모두 폐기 반영 tags: [cdn, bunnycdn, security] --- > [!warning] 2026-04-26 bouncer 단일화로 다음 layer 폐기 > - **Edge Script 64811** (`crowdsec-bouncer-middleware`) — 전 풀존에서 detach + 스크립트 자체 삭제 > - **CrowdSec bloom filter 동기화** — `infra-tool` 컨테이너의 `/opt/crowdsec-bouncer/bouncer.py` 정지 + 삭제 > - **국가 차단 layer** — Edge Script 64811 안에 구현됐던 분기라 함께 사라짐 > - **Turnstile `inouter-bunny-middleware` 위젯** — 미들웨어 env에서만 사용했어서 함께 폐기 > > 정리 경과: [[../history/2026-04-26-bouncer-consolidation|history]] > CrowdSec ban은 이제 `netbis-cf-firewall` (Cloudflare Firewall Rule, netbis 6 zone에만 적용) 만 enforce. BunnyCDN 풀존 (iron-jp / iron-kr 등)에는 IP-list 기반 차단 layer 없음. ## 현재 보호 layer (2026-04-26 기준) ``` 요청 → BunnyCDN 엣지 1. Bunny Shield WAF (OWASP CRS) — 모든 풀존 활성 2. Bunny Shield Rate Limiting — 풀존당 1개 (IPBurst200per10s) 3. MonthlyBandwidthLimit — 풀존당 100GB (i-gate 10GB) 4. Origin 전달 ``` IP-list 기반 차단/국가 차단은 현재 layer에 없음. CrowdSec 시나리오 발동 IP는 `netbis-cf-firewall` 경로 (netbis 6 zone) 또는 SafeLine WAF / APISIX limit-req 경로로만 차단. ## Pull Zone | ID | 이름 | OriginUrl | Smart Cache | IgnoreQS | BlockNoRef | 비고 | |---|---|---|---|---|---|---| | 5555227 | `iron-kr` | `https://220.120.65.245` | ✅ | false | true | 메인 inouter.com 계열 | | 5555247 | `iron-jp` | `https://172.233.93.180` | ✅ | false | true | **미사용 (2026-04-17 호스트네임 전부 제거)** | | 5555224 | `iron-kr-waf` | `https://220.120.65.245:9443` | ❌ | true | true | SafeLine WAF 다운스트림 보호 | | 5584382 | `iron-git` | `https://220.120.65.245` | ❌ | true | false | git smart HTTP — Rate Limit 미적용 | | 5557897 | `i-gate` | `https://172.233.93.180` | ❌ | true | true | idle 슬롯 | 전 풀존 `MiddlewareScriptId: null` (2026-04-26 Edge Script 64811 폐기 후 자동 정리). 공통 설정: `EnableLogging: true`, `EnableWebSockets: true (max 500)`, `EnableGeoZone*: true`, `BlockedCountries: []`, `BlockedIps: []`, `EdgeRules: []`, `OriginType: 0 (URL)`, `VerifyOriginSSL: false`, `EnableOriginShield: false`. ## 호스트네임 인벤토리 | Pull Zone | Hostname | 시스템? | |---|---|---| | iron-kr | `iron-kr.b-cdn.net` | ✅ | | iron-kr | `actions.it.com` | | | iron-kr | `n8n.inouter.com` | | | iron-kr | `jarvis.inouter.com` | | | iron-kr | `telegram-webhook.inouter.com` | | | iron-kr | `vault.inouter.com` | | | iron-kr-nowaf | `iron-kr-nowaf.b-cdn.net` | ✅ | | iron-kr-nowaf | `outline.inouter.com` | (WAF 제외용, 2026-04-21 이전) | | iron-jp | `iron-jp.b-cdn.net` | ✅ (시스템만 남음, 사용자 호스트 전부 제거 2026-04-17) | | iron-kr-waf | `iron-kr-waf.b-cdn.net` | ✅ | | iron-kr-waf | `juiceshop.keepanker.cv` | | | iron-git | `iron-git.b-cdn.net` | ✅ | | iron-git | `gitea.inouter.com` | | | i-gate | `i-gate.b-cdn.net` | ✅ | 총 13 (사용자 8 + 시스템 5). 전부 `HasCertificate: true` (Let's Encrypt 자동 발급/갱신). ## DDoS 과금 정책 (2026-04-17 지원팀 확인, Ticket #386429) - **WAF 차단 요청**: 과금됨. 차단 응답도 outgoing bandwidth로 집계. 단 Origin 응답보다 크기가 작아 비용은 적음 - **DDoS PoW 챌린지 페이지**: 과금 안 됨. 챌린지는 Bunny 소유 별도 도메인에서 호스팅되어 내 계정 대역폭 미포함 - **DDoS 크레딧/보호**: 공식 보장 없음. Shield가 정상 동작했음에도 피해가 큰 경우 케이스별 goodwill 크레딧 검토 가능 (보장 아님) - **대응**: Rate Limiting으로 불필요한 차단 응답 자체를 줄이고, MonthlyBandwidthLimit으로 비용 상한 설정 ## 대역폭 한도 (2026-04-17 설정) | Pull Zone | MonthlyBandwidthLimit | |-----------|----------------------| | iron-kr | 100 GB | | iron-jp | 100 GB | | iron-kr-waf | 100 GB | | iron-git | 100 GB | | i-gate | 10 GB | DDoS 비용 폭탄 방지용. 정상 월 사용량 ~1.2GB 대비 약 40배 여유. ⚠️ **MonthlyBandwidthLimit 초과 시 동작 (2026-04-17 지원팀 확인)**: - 503이 아니라 **Pull Zone 자체가 비활성화** — 모든 요청에 응답 불가 - DNS를 Bunny 밖으로 돌려야 복구됨 - **실시간 적용 아님** — cron job이 수 시간 간격으로 실행되어 초과 후에도 트래픽이 한동안 흐를 수 있음 - Rate Limiting 규칙: Shield 무료 플랜(planType: 0)은 풀존당 **2개**. 증가하려면 플랜 업그레이드 필요 - 무료 플랜 제한: timeframe 최대 10초, blockTime 최대 60초. Advanced 플랜 필요 시 더 긴 윈도우/차단 가능 ## Rate Limiting 규칙 (2026-04-17 설정, 전 풀존 동일) | 규칙 | requestCount | timeframe | blockTime | actionType | 용도 | |------|-------------|-----------|-----------|-----------|------| | IPBurst200per10s | 200 | 10s | 60s | 1 (Block) | 순간 폭주 (초당 20+) → 즉시 차단 | 무료 플랜 1/2 슬롯 사용. MidRate 규칙은 NAT/공유기 환경 오탐 + 비브라우저 클라이언트(git, API) 호환 문제로 삭제 (2026-04-17). ⚠️ **iron-git (5584382)은 rate limit 규칙 없음** — git smart HTTP는 push/pull 시 단기간에 대량 요청을 보내므로 rate limit에 걸림. git 클라이언트는 Challenge도 통과 불가. 2026-04-17 rate limit으로 인한 접속 장애 발생 후 규칙 전부 삭제. ## 폐기된 자산 (참고 — 재가동 시 history 참조) | 자산 | 폐기일 | 비고 | |---|---|---| | Edge Script 64811 `crowdsec-bouncer-middleware` | 2026-04-26 | DELETE `/compute/script/64811` HTTP 204. iron-jp/iron-kr/iron-kr-waf/iron-git MiddlewareScriptId 자동 null | | `infra-tool:/opt/crowdsec-bouncer/bouncer.py` (bloom sync) | 2026-04-26 | cron + 디렉토리 삭제 | | Turnstile `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`) | 2026-04-26 | env baked-in, 미들웨어 폐기와 함께 | | 국가 차단 layer (Edge Script 코드 내 분기) | 2026-04-26 | 미들웨어 코드 자체가 사라짐 | | Vault `secret/cloud/cloudflare/turnstile-inouter-bunny` | 보존 | 폐기 결정 후속 | | Gitea `kaffa/crowdsec-bunny-bouncer` (소스) | 보존 | 재구축 reference | 상세: [[../history/2026-04-26-bouncer-consolidation|history]] ## 관련 문서 - [[bunnycdn]] — BunnyCDN API 레퍼런스 - [[../infra/security/crowdsec-safeline|crowdsec-safeline]] — CrowdSec 및 SafeLine WAF 설정 - [[../infra/security/cloudflare|cloudflare]] — Cloudflare DNS/CDN (Turnstile 위젯 정본)