Files
obsidian/infra/security/cloudflare.md
kaffa d25dc3e52f obsidian 정합성 정정 — bouncer 단일화 잔존 stale 정리
- infra/compute/infra-hosts.md: jp1 default 20→19, cs-cf-worker-bouncer 컨테이너 라인에서 제거
- services/bunnycdn-security.md: Edge Script 64811 / bloom filter / 국가차단 / Turnstile inouter-bunny 폐기 반영. 현재 layer (Bunny Shield + Rate Limit + 대역폭 한도) 중심 재작성
- infra/network/apisix.md: Edge Script 64811 attach 라인 폐기 표시
- infra/security/cloudflare.md: Workers 인벤토리 + Worker 라우트 + CF proxy 패턴 + cfb-manager 절 모두 폐기 반영
- infra/security/crowdsec-safeline.md: cs-cf-worker-bouncer 운영 중 문장 폐기 표시
- ops-agents/overview.md: Syn 영역 정의에서 폐기 자산 명시
- history/_index.md: 누락된 2026-04-25-netbis-npm-vector-msg-rewrite, 2026-04-26-bouncer-consolidation 등록 + frontmatter updated
2026-04-26 10:33:48 +09:00

241 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Cloudflare 서비스
updated: 2026-04-26 bouncer 단일화로 Turnstile 위젯 6개 + Worker/KV 정리 반영
tags: [infra, cloudflare, cdn, dns]
---
Syn 이 엣지 관점에서 소유. 일반 DNS 관리 협업은 Heimdall.
## 계정
- ID: `d8e5997eb4040f8b489f09095c0f623c` (kappa@inouter.com)
- API 토큰: Vault `secret/cloud/cloudflare` (`api_token`, `email`)
### API 토큰 권한 범위 (2026-04-13 실측)
| 엔드포인트 | 권한 |
|-----------|------|
| Zone Read | ✅ |
| DNS Read/Write | ✅ |
| Turnstile Read | ✅ (Write는 ❌ 403) |
| Workers Read | ✅ |
| KV Read | ✅ |
| Rulesets (WAF/Rate Limit 규칙) | ❌ 403 |
| Firewall Rules | ❌ 403 |
| Rate Limits (legacy) | ❌ 403 |
| Zone Settings | ❌ 403 |
⚠️ **Rate Limit, WAF 규칙, Firewall 설정은 API로 조회/변경 불가 — 대시보드에서만 관리 가능**. 토큰 스코프 확장이 필요하면 CF 대시보드 > My Profile > API Tokens에서 편집.
## Pseudo IPv4 (Class E 240/4)
레거시 IPv4-only 백엔드를 위한 CF 기능. **Netbis zone에서 활성 상태로 관찰됨** (Apache 2.4.38 + PHP 5.6.40). Kappa 계정 zone에는 현재 기본 Off로 추정.
### 동작 원리
```
클라이언트 (IPv6) → CF 엣지
→ IPv6 주소 상위 64비트를 MD5 해시
→ 결과를 240.0.0.0/4 (240~255.x.x.x) 범위의 IPv4로 매핑
→ CF-Connecting-IP 및 X-Forwarded-For 헤더를 해시된 IPv4로 overwrite
→ 진짜 IPv6는 Cf-Connecting-IPv6 별도 헤더로 전달
```
### 모드 3종 (CF 대시보드 Network → Pseudo IPv4)
| 모드 | CF-Connecting-IP | 별도 헤더 |
|------|-----------------|----------|
| Off | 실 IPv6/IPv4 | - |
| Add header | 실 IP 그대로 | `Cf-Pseudo-IPv4`에 해시 |
| **Overwrite headers** | 해시(240/4) | `Cf-Connecting-IPv6`에 실 IPv6 |
### 관찰 시그널 (Netbis)
- VL `client_ip` 필드 중 240.0.0.0/4 대역 IP 등장 = IPv6 접속자
- UA 분포: 95%+ 모바일 (Android Chrome / iPhone Safari / KakaoTalk / Daum / NAVER) — KR 모바일 IPv6 보급률 높음
- 동일 IPv6 `/64` prefix → 항상 같은 240/4 IP로 매핑 (재현 가능한 식별자)
- **한 240/4 IP = 한 가정/ /64 단위 유저 집합** — ban 시 /64 전체가 차단됨
### 오해 주의
- 240/4는 KR 통신사 CGNAT 아님 (공식 문서 없음, 공개 라우팅도 안 됨)
- 실제로는 CF Pseudo IPv4 해시값 — "가짜 IP"
- CGNAT 오인하면 차단 효과 완전히 다르게 판단됨
### 관련 링크
- [CF Pseudo IPv4 docs](https://developers.cloudflare.com/network/pseudo-ipv4/)
- [CF Support: Pseudo IPv4 overview](https://support.cloudflare.com/hc/en-us/articles/229666767)
## Zone
| Zone | Zone ID | Status | Plan | NS | DNS rec | 비고 |
|---|---|---|---|---|---|---|
| **actions.it.com** | `dd7db273…` | active | Free | earl/raegan | 2 | apex+wildcard CNAME → BunnyCDN. `*.actions.it.com → actions.b-cdn.net` 는 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. cert-manager wildcard + CrowdSec bouncer + Turnstile 위젯은 세팅된 상태 (배포 준비용 유지) |
별도 계정 [[netbis]] 의 6개 zone 은 본 문서 범위 외 — netbis-cf-bouncer 가 별도로 관리.
## DNS 레코드 — zone 별 핵심
### actions.it.com
| Name | Type | Value | Proxied |
|---|---|---|---|
| `actions.it.com` | CNAME | `iron-kr.b-cdn.net` | ✅ |
| `*.actions.it.com` | CNAME | `actions.b-cdn.net` (dead 풀존) | ✅ |
### anvil.it.com
| 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 | | | |
### inouter.com
| 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 | |
| `desk-api.inouter.com` | A | `172.233.93.180` | ✅ | osaka 직통, CF proxied |
| `sftp.inouter.com` | A | `220.120.65.245` | ✅ | OpenWrt 직통, CF proxied |
| `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) | | | | |
`nas.inouter.com` 은 특정 A/CNAME 레코드 없음. `*.inouter.com` 와일드카드 폴백으로 `192.168.9.53` (LAN MetalLB VIP) 로 해석되어 K3s `lan-proxies/nas` IngressRoute 를 통해 Synology DSM (`192.168.9.100:5000`) 으로 reverse proxy. 상세 [[nas-storage#DSM Reverse Proxy — `nas.inouter.com`]].
### ironclad.it.com
| 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
| 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. juiceshop 은 BunnyCDN iron-kr-waf 로 override.
### servidor.it.com
DNS 레코드 없음. zone 만 등록. 워커 라우트 + Turnstile 위젯 + cert-manager wildcard cert 는 세팅되어 있으며 배포 준비 상태로 유지.
## Workers
| Worker | 라우트 부착 zones | 비고 |
|---|---|---|
| ~~**crowdsec-cloudflare-worker-bouncer**~~ | _(폐기)_ | **2026-04-26 bouncer 단일화로 Worker 스크립트 + KV namespace + 라우트 4개 모두 삭제.** [[../../history/2026-04-26-bouncer-consolidation\|history]] |
| **ironclad-site** | ironclad.it.com (apex) | 정적 사이트, has_assets |
| **cf-multisite** | `*.actions.it.com/*` | 라우팅 워커 |
| chat-worker | (없음) | workers.dev only |
| cloud-instances-api | (없음) | workers.dev only |
| cloud-orchestrator | (없음) | workers.dev only |
| telegram-ai-support | (없음) | workers.dev only |
| telegram-cli-web | (없음) | workers.dev only |
| telegram-summary-bot | (없음) | workers.dev only |
### Worker 라우트 (zone 별)
| Zone | Pattern | Script |
|---|---|---|
| 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, 미정리) |
| ironclad.it.com | `ironclad.it.com/*` | ironclad-site |
> [!note] cs-cf-worker-bouncer 라우트 4개 폐기 (2026-04-26)
> `*actions.it.com/*`, `*ironclad.it.com/*`, `*keepanker.cv/*`, `*servidor.it.com/*` Worker 라우트는 bouncer 단일화로 모두 제거. Worker 스크립트 + KV namespace + Turnstile 위젯 4개 함께 폐기. [[../../history/2026-04-26-bouncer-consolidation|history]]
inouter.com / anvil.it.com 에는 Worker 라우트 없음. DNS proxied=false 라 CF 엣지를 거치지 않으므로 enforce 불가. ~~BunnyCDN 미들웨어 64811 단독 책임~~ 도 2026-04-26 폐기 — 현재 이들 zone 엣지 IP 차단 layer 부재 (Bunny Shield WAF + Rate Limit + 풀존 BlockedIps 만 가능).
Worker Custom Domains (계정 레벨): 0건.
## Turnstile 위젯
| Sitekey | 이름 | mode | 도메인 | 역할 |
|---|---|---|---|---|
| `0x4AAAAAABvmO8BKc1ss5d-S` | `crowdsec-captcha` | managed | actions / anvil / charon.my / ironclad / keepanker / n8n.my / servidor / subin.my | multi-domain 운영용 (8 도메인). 수동 관리. **bouncer 외 사용처 추적 미완 — 폐기 보류** |
> [!note] bouncer 단일화로 위젯 6개 정리 (2026-04-26)
> - `crowdsec-cloudflare-worker-bouncer-widget` × 4 (actions.it.com / ironclad.it.com / keepanker.cv / servidor.it.com): cs-cf-worker-bouncer 폐기로 자동 사용처 사라짐 → 삭제
> - `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`): BunnyCDN 미들웨어 64811 폐기와 함께 삭제
> - `inouter` (`0x4AAAAAACbmaudAjITah7y7`): legacy orphan 정리 차원 삭제
> - 정리 경과: [[../../history/2026-04-26-bouncer-consolidation|history]]
Vault 시크릿 잔여 (위젯 삭제됐지만 시크릿은 보존 — 재가동 시 새 위젯 발급해서 덮어쓰기):
- `secret/cloud/cloudflare/turnstile-crowdsec-captcha` (현역 `crowdsec-captcha` 위젯용)
- `secret/cloud/cloudflare/turnstile-inouter-bunny` (삭제된 `inouter-bunny-middleware` legacy)
### Turnstile 토큰 권한 (현재)
- **Vault `secret/cloud/cloudflare.api_token`** (`pUIZdTV0…`): DNS R/W + Turnstile **read-only**. 위젯 생성/수정/삭제 불가
- **`global_api_key`** (Vault `secret/cloud/cloudflare.global_api_key`): 모든 권한. 위젯 삭제 등 write 작업은 이쪽 사용
- ~~jp1 bouncer 호스트의 yaml 내 `token: seUKZID4…`~~: bouncer 컨테이너 삭제와 함께 분실 (2026-04-26)
## 특이사항
- **`*.actions.it.com → actions.b-cdn.net`** — 와일드카드가 dead 풀존 가리킴. 일부 서브가 5xx 가능. 미정리 (영향 평가 후 별건)
- **Worker routes `vultr.actions.it.com/*`, `linode.actions.it.com/*`** — `script: null` orphan. 미정리
- ~~**Turnstile `inouter` legacy**~~ — 2026-04-26 정리 완료
- **Turnstile `crowdsec-captcha` (8 도메인)** — `charon.my`, `n8n.my`, `subin.my` 등 사용처 미확인 → 폐기 보류
### CF proxy on/off 패턴
| Zone | Proxy | 보호 |
|---|---|---|
| inouter.com / anvil.it.com | off | _IP-list enforce 부재 (2026-04-26 BunnyCDN 미들웨어 64811 폐기 후). Bunny Shield WAF + Rate Limit + 풀존 BlockedIps 만 가능_ |
| actions.it.com / ironclad.it.com | on | CF Worker (cf-multisite / ironclad-site). ~~bouncer~~ 폐기 2026-04-26 |
| keepanker.cv | on (Tunnel) | CF Tunnel + juiceshop 만 iron-kr-waf override. ~~bouncer~~ 폐기 2026-04-26 |
| servidor.it.com | on | ~~bouncer~~ 폐기 2026-04-26, 현재 별도 보호 layer 없음 |
> [!warning] cs-cf-worker-bouncer + BunnyCDN 미들웨어 64811 폐기 (2026-04-26)
> kappa zone 4개 (keepanker / actions / ironclad / servidor) + inouter / anvil 에서 CrowdSec 결정 enforce layer가 사라짐. CrowdSec ban은 현재 `netbis-cf-firewall` (netbis 6 zone) 만 enforce. 자세한 영향: [[../../history/2026-04-26-bouncer-consolidation|history]]
## ~~cfb-manager~~ (폐기 2026-04-26)
> [!warning] cs-cf-worker-bouncer 폐기와 함께 cfb-manager도 의미 상실
> cs-cf-worker-bouncer 자체가 사라져 `bouncer_running` / `widget rotate` 등 cfb-manager의 핵심 기능이 동작하지 않음. K8s `default/cfb-manager` Deployment는 별도 정리 결정 필요 (보존 / 폐기). [[../../history/2026-04-26-bouncer-consolidation|history]]
## 관련 문서
- [[netbis]] — Netbis 계정 Cloudflare (별도)
- [[cf-multisite]] — `*.actions.it.com` 라우팅 워커
- [[crowdsec-safeline]] — CrowdSec CF Worker Bouncer 연동
- [[bunnycdn-security]] — BunnyCDN 엣지 보안
- [[nas-storage]] — Synology NAS + `nas.inouter.com` reverse proxy