edge: 2026-04-10 BunnyCDN+CF 전수 감사 결과 정본 반영

- 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 링크.
This commit is contained in:
Syn
2026-04-10 08:10:06 +09:00
parent fb5a34ebcc
commit 639c9b5a0d
2 changed files with 269 additions and 40 deletions

View File

@@ -1,44 +1,220 @@
---
title: Cloudflare 서비스
updated: 2026-04-04
tags: [infra, cloudflare, cdn]
updated: 2026-04-10
tags: [infra, cloudflare, cdn, dns]
---
## Zone
> 2026-04-10 전수 감사 (Outline `agent-qna` doc `51b963c3-b251-48b5-a57a-a2305959c470`) 결과 반영. Syn 이 엣지 관점에서 소유. 일반 DNS 관리 협업은 Heimdall.
- ironclad.it.com (zone ID: bc8761b398cc52cf731f804bd3cbf388)
- inouter.com (zone ID: cd84743d9c61b97bada5ce903a29ae2b)
## 계정
## inouter.com DNS 주요 레코드
- ID: `d8e5997eb4040f8b489f09095c0f623c` (kappa@inouter.com)
- API 토큰: Vault `secret/cloud/cloudflare` (`api_token`, `email`)
- **Turnstile 쓰기 권한 없음** — 현 토큰은 read-only. 신규 위젯은 CF 대시보드 수동 또는 별도 권한 토큰 필요.
- jarvis.inouter.com → CNAME actions.b-cdn.net (프록시 OFF, [[bunnycdn]] 경유)
- telegram-webhook.inouter.com → CNAME actions.b-cdn.net (프록시 OFF)
- vault.inouter.com → CNAME actions.b-cdn.net (프록시 OFF)
- desk-api.inouter.com → A 172.233.93.180 (프록시 ON, 오사카)
- nocodb.inouter.com → CNAME k3s.inouter.com (프록시 OFF)
- n8n.inouter.com → CNAME actions.b-cdn.net (프록시 OFF)
## Zone 전수 (6개, 2026-04-10)
참고: Cloudflare Free 플랜은 서울에서 LA PoP로 라우팅됨. 서울 백엔드 서비스는 BunnyCDN(아시아 PoP)으로 전환함.
| Zone | Zone ID | Status | Plan | NS | DNS rec | 비고 |
|---|---|---|---|---|---|---|
| **actions.it.com** | `dd7db273…` | active | Free | earl/raegan | 2 | apex+wildcard CNAME → BunnyCDN, **wildcard 가 dead 풀존 가리킴** ⚠ |
| **anvil.it.com** | `742f4c98…` | active | Free | earl/raegan | 9 | apex/wildcard CNAME → iron-jp, ssh.anvil.it.com A, Cloudflare Email Routing |
| **inouter.com** | `cd84743d…` | active | Free | earl/raegan | 32 | 메인 zone. 와일드카드 → k3s.inouter.com (LAN), 다수 서브가 iron-kr/iron-git 으로 분기 |
| **ironclad.it.com** | `bc8761b3…` | active | Free | earl/raegan | 14 | apex+wildcard A `172.233.93.180` (proxied), Mailgun MX, AWS SES DKIM |
| **keepanker.cv** | `118ac337…` | active | Free | lochlan/olivia | 3 | apex/wildcard → **Cloudflare Tunnel** (`cfargotunnel.com`), juiceshop CNAME → iron-kr-waf |
| **servidor.it.com** | `a6e1a3f1…` | active | Free | earl/raegan | **0** ⚠ | **DNS 레코드 0건 — orphan zone**. 워커 라우트 + Turnstile 위젯만 살아 있음 |
## Workers
총 60건 (servidor 제외).
Cloudflare Workers로 [[telegram-bot|텔레그램]] 웹훅 처리
별도 계정 [[netbis]] 의 6개 zone (fall-vip / psd777 등) 은 본 문서 범위 외 — netbis-cf-bouncer 가 별도로 관리.
## R2 스토리지
## DNS 레코드 — zone 별 핵심
Cloudflare R2를 스토리지로 사용
### actions.it.com (2)
## Redirect Rule
| Name | Type | Value | Proxied |
|---|---|---|---|
| `actions.it.com` | CNAME | `iron-kr.b-cdn.net` | ✅ |
| `*.actions.it.com` | CNAME | **`actions.b-cdn.net`** ⚠ dead | ✅ |
Cloudflare Redirect Rule로 자체 도메인 리다이렉트 설정
### anvil.it.com (9)
## DNS 프리셋
| Name | Type | Value | Proxied |
|---|---|---|---|
| `anvil.it.com` | CNAME | `iron-jp.b-cdn.net` | off |
| `*.anvil.it.com` | CNAME | `iron-jp.b-cdn.net` | off |
| `n8n.anvil.it.com` | CNAME | `iron-jp.b-cdn.net` | off |
| `kroki.anvil.it.com` | CNAME | `k3s.inouter.com` | off |
| `ssh.anvil.it.com` | A | `139.162.71.52` | off |
| MX×3 (Cloudflare Email Routing), DKIM TXT 1건 | | | |
프리셋: cloudflare, aws, google, github, bunnycdn
### inouter.com (32) — 핵심
| Name | Type | Value | Proxied | 메모 |
|---|---|---|---|---|
| `*.inouter.com` | CNAME | `k3s.inouter.com` | off | LAN 직통 (BunnyCDN 우회) |
| `k3s.inouter.com` | A | `192.168.9.53` | off | Traefik MetalLB VIP |
| `kr.inouter.com` | A | `220.120.65.245` | off | OpenWrt 공인 IP |
| `jp.inouter.com` | A | `42.125.196.116` | off | jp1 |
| `derp.inouter.com` | A | `42.125.196.116` | off | jp1 derp |
| `gitea.inouter.com` | CNAME | `iron-git.b-cdn.net` | off | 별도 풀존 (미들웨어 우회) |
| `n8n.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `jarvis.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `vault.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `outline.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `telegram-webhook.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `nas.inouter.com` | CNAME | **`actions.b-cdn.net`** ⚠ dead | off |
| `desk-api.inouter.com` | A | `172.233.93.180` | ✅ | osaka 직통, CF proxied |
| `sftp.inouter.com` | A | `220.120.65.245` | ✅ | OpenWrt 직통, CF proxied |
| `ironclad.jp.inouter.com` | A | **`10.19.228.193`** ⚠ | off | **사설 IP 공개 노출** |
| `k8s.jp.inouter.com` | A | **`10.253.103.124`** ⚠ | off | **사설 IP 공개 노출** |
| `git.inouter.com` | A | `52.79.45.166` | off | relay4wd Lightsail |
| `teleport.inouter.com` | A | `52.79.45.166` | off | relay4wd Lightsail |
| `twilio.jp.inouter.com` | A | `172.233.93.180` | off |
| `bunny.mcp.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `vl.inouter.com` | CNAME | `k3s.inouter.com` | off | [[victorialogs|VictoriaLogs]] |
| `emulator.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `linode.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `namecheap.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `vultr.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `email.inouter.com` | CNAME | `mailgun.org` | off |
| MX×2 Mailgun, TXT (SPF/DMARC/DKIM/google verification) | | | |
> **이전 메모(updated 2026-04-04)는 폐기**: jarvis/telegram-webhook/vault/n8n 이 `actions.b-cdn.net` 가리킨다는 기록은 dead 풀존을 가리키는 구식 정보. 실제 정본은 위 표와 같이 모두 `iron-kr.b-cdn.net`.
### ironclad.it.com (14)
| Name | Type | Value | Proxied |
|---|---|---|---|
| `ironclad.it.com` | A | `172.233.93.180` | ✅ |
| `*.ironclad.it.com` | A | `172.233.93.180` | ✅ |
| MX×2 Mailgun, AWS SES DKIM CNAME×3, TXT (SPF/DMARC/google) | | | |
> ironclad.it.com 은 **BunnyCDN 풀존을 거치지 않음**. CF proxied A 로 osaka 172.233.93.180 직통. 보호는 CF Worker (`ironclad-site` apex + bouncer wildcard) 단독.
### keepanker.cv (3)
| Name | Type | Value | Proxied |
|---|---|---|---|
| `keepanker.cv` | CNAME | `f1aa79f2-….cfargotunnel.com` | ✅ |
| `*.keepanker.cv` | CNAME | `f1aa79f2-….cfargotunnel.com` | ✅ |
| `juiceshop.keepanker.cv` | CNAME | `iron-kr-waf.b-cdn.net` | off |
apex/wildcard 는 Cloudflare Tunnel (cfargotunnel). juiceshop 은 BunnyCDN iron-kr-waf 로 override.
### servidor.it.com (0)
DNS 레코드 **없음**. zone 만 등록. 워커 라우트 + Turnstile 위젯은 살아있음 → 트래픽 자체가 불가능한데 보안 자원만 회전 중. zone 정리 또는 DNS 레코드 추가 결정 필요.
## Workers (9개)
| Worker | 라우트 부착 zones | 비고 |
|---|---|---|
| **crowdsec-cloudflare-worker-bouncer** | actions, anvil, inouter, ironclad, keepanker, servidor (전 6 zone) | CrowdSec CF bouncer 본체. cs-cf-worker-bouncer (jp1) 가 168h 마다 secret rotate. 정본 [[crowdsec-safeline]] |
| **ironclad-site** | ironclad.it.com (apex) | 정적 사이트, has_assets |
| **cf-multisite** | `*.actions.it.com/*` | 라우팅 워커 |
| chat-worker | (없음) | workers.dev only |
| cloud-instances-api | (없음) | 〃 |
| cloud-orchestrator | (없음) | 〃 |
| telegram-ai-support | (없음) | 〃 |
| telegram-cli-web | (없음) | 〃 |
| telegram-summary-bot | (없음) | 〃 |
### Worker 라우트 (zone 별)
| Zone | Pattern | Script |
|---|---|---|
| actions.it.com | `*actions.it.com/*` | crowdsec-cloudflare-worker-bouncer |
| actions.it.com | `*.actions.it.com/*` | cf-multisite |
| actions.it.com | `vultr.actions.it.com/*` | **null** ⚠ orphan |
| actions.it.com | `linode.actions.it.com/*` | **null** ⚠ orphan |
| anvil.it.com | `*anvil.it.com/*` | crowdsec-cloudflare-worker-bouncer |
| inouter.com | `*inouter.com/*` | crowdsec-cloudflare-worker-bouncer |
| ironclad.it.com | `ironclad.it.com/*` | ironclad-site |
| ironclad.it.com | `*ironclad.it.com/*` | crowdsec-cloudflare-worker-bouncer |
| keepanker.cv | `*keepanker.cv/*` | crowdsec-cloudflare-worker-bouncer |
| servidor.it.com | `*servidor.it.com/*` | crowdsec-cloudflare-worker-bouncer |
> Worker Custom Domains (계정 레벨): **0건**.
## Turnstile 위젯 (8개)
| Sitekey | 이름 | mode | 도메인 | 역할 |
|---|---|---|---|---|
| `0x4AAAAAABvmO8BKc1ss5d-S` | `crowdsec-captcha` | managed | actions / anvil / charon.my / ironclad / keepanker / n8n.my / servidor / subin.my | multi-domain 운영용 (8 도메인). 2025-08-29 생성 |
| `0x4AAAAAACbmaudAjITah7y7` | `inouter` | managed | anvil.it.com **만** | 2026-02-13 생성. **이름과 도메인 불일치 → legacy/orphan 후보** |
| `0x4AAAAAAC2cnEA797HwesRX` | `crowdsec-cloudflare-worker-bouncer-widget` | managed | anvil.it.com | bouncer 자동 (168h rotation) |
| `0x4AAAAAAC2cnZzIyNRayTcG` | 〃 | managed | servidor.it.com | bouncer 자동 |
| `0x4AAAAAAC2cntUlRC3KKMKG` | 〃 | managed | inouter.com | bouncer 자동. **현재 BunnyCDN 미들웨어 64811 이 사용 중** |
| `0x4AAAAAAC2cn8bzKBex_ihU` | 〃 | managed | actions.it.com | bouncer 자동 |
| `0x4AAAAAAC2coNrK9rRq7S_b` | 〃 | managed | keepanker.cv | bouncer 자동 |
| `0x4AAAAAAC2coU0PB8O8oJqY` | 〃 | managed | ironclad.it.com | bouncer 자동 |
bouncer 자동 위젯 6개는 `cs-cf-worker-bouncer` 가 rotate. **수동 편집 금지** — 다음 rotate 때 덮어써짐.
## 특이사항
### Orphan / dead 자원
| 항목 | 내용 |
|---|---|
| **servidor.it.com zone** | DNS 레코드 0건. 워커 라우트 + Turnstile 위젯만 살아있음. 트래픽 불가능하나 168h 마다 위젯 회전. zone 정리 또는 DNS 추가 결정 필요. |
| **`nas.inouter.com → actions.b-cdn.net`** | 가리키는 풀존 `actions` (구 5330178) 가 현 계정에 없음. dead reference. |
| **`*.actions.it.com → actions.b-cdn.net`** | 와일드카드 자체가 dead 풀존 가리킴. proxied=on 이라 CF 가 어디로 보내는지 의문. 일부 서브가 5xx 가능. |
| **Worker route `vultr.actions.it.com/*`, `linode.actions.it.com/*`** | `script: null`. 등록만 되고 워커 미연결. (linode.actions.it.com 자체는 BunnyCDN iron-jp 호스트네임으로도 있음 — 중복 의도?) |
| **Turnstile `inouter` (sitekey `…CbmaudAjITah7y7`)** | 이름은 inouter 인데 허용 도메인은 anvil.it.com 단일. legacy 후보. |
### 사설 IP 공개 DNS 노출
| 레코드 | 값 |
|---|---|
| `ironclad.jp.inouter.com` | A `10.19.228.193` (사설망 10/8) |
| `k8s.jp.inouter.com` | A `10.253.103.124` (jp1 incus 사설 대역) |
→ 외부 해석은 가능하나 라우팅 불가. 정보 유출 정도의 리스크. Tailscale Magic DNS 또는 split-horizon 으로 옮기는 게 깔끔.
### CF proxy on/off 패턴 (중요)
- **inouter.com / anvil.it.com**: 거의 전부 `proxied: false` — CF 는 DNS 만, 트래픽은 BunnyCDN 또는 LAN 직통. CF Worker bouncer 라우트는 등록되었으나 **DNS 가 proxied=false 면 CF 엣지를 거치지 않음** → bouncer 무효.
- **actions.it.com / ironclad.it.com**: apex/wildcard 모두 `proxied: true` — CF Worker 효과적으로 enforce.
- **keepanker.cv**: CF Tunnel.
> **함의**: `inouter.com` / `anvil.it.com` 의 보호는 **BunnyCDN 미들웨어 64811 이 단독 책임**. CF Worker bouncer 는 라우트 등록 + Turnstile 위젯 회전만 하고 실제 enforcement 는 안 함. 의도된 design 인지 (BunnyCDN 우선) 또는 누락인지 결정 필요. design 이라면 inouter / anvil 의 CF Worker 라우트는 제거 가능.
### 정책 일관성
- iron-kr `IgnoreQueryStrings: true` vs iron-jp `IgnoreQueryStrings: false` — 같은 미들웨어 64811 공유인데 캐시 키 정책이 다름. iron-jp 트래픽이 미미해 영향 작지만 통일이 운영 단순화.
## cfb-manager (CrowdSec CF Worker bouncer 관리 API)
| 항목 | 값 |
|---|---|
| 위치 | K3s `default/cfb-manager` (10.43.68.76:8000) |
| 구현 | Python FastAPI |
| 기능 | bouncer 보호 도메인 추가/삭제, decision 조회, CF zone 동기화, bouncer 재시작 트리거 |
| SSH 키 | K8s `default/cfb-ssh-key` 시크릿 (ed25519, 2026-04-09 재생성) |
```bash
BASE=http://cfb-manager.default.svc.cluster.local:8000
curl $BASE/status # bouncer_running, pids, protected_domains
curl $BASE/domains # 보호 중인 zone 상세
curl $BASE/decisions # 현재 결정
curl -X POST $BASE/sync?auto_apply=true # CF 의 모든 zone 을 보호 목록 동기화
```
> **BunnyCDN 미들웨어와는 무관**. BunnyCDN 미들웨어 64811 의 bloom filter 동기화는 jp1 `infra-tool` 컨테이너 `/opt/crowdsec-bouncer/bouncer.py` (3분 delta + 매시 full sync) 가 담당.
## 참조
- 전수 감사 정본 (대화 로그): Outline `agent-qna` doc `51b963c3-b251-48b5-a57a-a2305959c470` (2026-04-10)
- 워크스페이스 런북: `~/syn/cloudflare/README.md`
- BunnyCDN 매핑: [[bunnycdn-security]]
- CrowdSec/Worker bouncer: [[crowdsec-safeline]]
- 별도 계정: [[netbis]] (Netbis 계정 6 zone, 별도 cs-cf-worker-bouncer)
- DNS 프리셋: cloudflare, aws, google, github, bunnycdn
## 관련 문서
- [[netbis]] — Netbis 계정 Cloudflare 설정 (6개 zone, Rate Limiting, SBFM)
- [[cf-multisite]] — 멀티사이트 Cloudflare 설정
- [[netbis]] — Netbis 계정 Cloudflare (별도)
- [[cf-multisite]] — `*.actions.it.com` 라우팅 워커
- [[crowdsec-safeline]] — CrowdSec CF Worker Bouncer 연동
- [[bunnycdn-security]] — BunnyCDN 엣지 보안

View File

@@ -1,9 +1,11 @@
---
title: BunnyCDN 엣지 보안 (CrowdSec + 국가 차단)
updated: 2026-04-09
updated: 2026-04-10
tags: [cdn, bunnycdn, security, crowdsec, edge-script]
---
> 2026-04-10 전수 감사 (Outline `agent-qna` doc `51b963c3-b251-48b5-a57a-a2305959c470`) 결과 반영. 5개 풀존, 17개 호스트네임, 미들웨어 64811 attach 매트릭스를 모두 정본화.
## 구성
- 엣지 스크립트: `crowdsec-bouncer-middleware` (ID: 64811, ScriptType=2 Middleware)
@@ -41,31 +43,82 @@ US, CA, GB, DE, FR, IT, ES, NL, BE, AT, CH, SE, NO, DK, FI, PL, CZ, PT, IE, RO,
- 엣지 스크립트의 국가 차단은 `Cdn-RequestCountryCode` 헤더 기반 → CDN 내부 요청(Let's Encrypt, Origin Shield)에는 이 헤더가 없으므로 영향 없음
- Free SSL 자동 발급/갱신 정상 동작
## Pull Zone 설정 (2026-04-09)
## Pull Zone 전수 (2026-04-10)
| Pull Zone | ID | Origin | 호스트 수 | 비고 |
|-----------|----|--------|----------|------|
| iron-kr | 5555227 | https://220.120.65.245 (서울) | 사용자 6 + 시스템 1 | actions.it.com / outline / vault / n8n / jarvis / telegram-webhook + iron-kr.b-cdn.net. `IgnoreQueryStrings: true` |
| iron-jp | 5555247 | https://172.233.93.180 (오사카) | 사용자 4 + 시스템 1 | anvil.it.com / n8n.anvil / tg.anvil / linode.actions + iron-jp.b-cdn.net. `IgnoreQueryStrings: false` |
| 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 |
공통:
- `VerifyOriginSSL: false`
- `BlockedCountries: []` (엣지 스크립트에서 헤더 기반 처리)
- `EnableOriginShield: false`
- `BlockNoneReferrer: true`
- `MiddlewareScriptId: 64811`
- `EdgeRules: []` (Edge Rules 미사용 — 모든 분기는 미들웨어 코드 안)
공통: `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.
## CrowdSec Bouncer 구조
## 호스트네임 인벤토리 (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 (jp1 Incus) → 악성 IP 탐지
CrowdSec LAPI (jp1 Incus, 10.253.100.240:8080) → 악성 IP decision
cfb-manager (K3s tools ns) → bloom filter 생성 → BunnyCDN API로 엣지 스크립트 코드에 삽입
infra-tool 컨테이너 (jp1) /opt/crowdsec-bouncer/bouncer.py
├ 3분 delta sync
└ 매시 full sync
엣지 스크립트 → 요청 IP를 bloom filter로 체크 → hit 시 캡차/차단
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` (K8s `default/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.com` zone 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.com` Cloudflare DNS 가 아직 `actions.b-cdn.net` 을 가리키는 dead reference 가 남아 있음 — [[cloudflare]] 정리 필요.
## 참조
- 전수 감사 정본 (대화 로그): Outline `agent-qna` doc `51b963c3-b251-48b5-a57a-a2305959c470` (2026-04-10)
- 워크스페이스 런북: `~/syn/bunnycdn/README.md`
- API 레퍼런스: [[bunnycdn]]
## 관련 문서
- [[bunnycdn]] — BunnyCDN API 레퍼런스