Files
obsidian/infra/security/cloudflare.md

230 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-07-21 actions.it.com, servidor.it.com zone 삭제 반영
tags: [infra, cloudflare, cdn, dns]
---
> [!note] Syn 에이전트는 2026-07-21 decommission됨 ([[../../ops-agents/overview|ops-agents/overview]] 참고). 아래 "Syn 소유" 서술은 재구성 전까지 kappa가 직접 관리.
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 | 비고 |
|---|---|---|---|---|---|---|
| **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 |
별도 계정 [[netbis]] 의 6개 zone 은 본 문서 범위 외 — netbis-cf-bouncer 가 별도로 관리.
> [!warning] actions.it.com, servidor.it.com zone 삭제 (2026-07-21)
> 두 도메인 모두 2026-07-18 네임서버가 Cloudflare(earl/raegan)에서 `ns1/ns2.lander.d.parity.domains`(파킹/랜딩 서비스로 추정)로 이미 이관된 상태였음 — 트래픽 영향 없이 CF zone API로 삭제. zone 삭제로 첨부된 DNS 레코드·Worker 라우트도 함께 사라짐. 상세: [[../../history/2026-07-21-cf-zone-cleanup|history]]
## DNS 레코드 — zone 별 핵심
### 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 | |
| `rustdesk.inouter.com` | A | `42.125.196.116` | off | jp1 RustDesk (raw TCP/UDP라 프록시 불가, DNS-only). [[../../services/rustdesk]] |
| `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.
## 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 zone 삭제(2026-07-21)로 라우트 소실. 스크립트 자체는 계정에 남아있음 — 재사용 안 하면 별도 정리 |
| 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 |
|---|---|---|
| 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 풀존~~ — 2026-07-21 actions.it.com zone 삭제로 해소
- ~~Worker routes `vultr.actions.it.com/*`, `linode.actions.it.com/*` orphan~~ — 2026-07-21 actions.it.com zone 삭제로 해소
- ~~**Turnstile `inouter` legacy**~~ — 2026-04-26 정리 완료
- **Turnstile `crowdsec-captcha`** — 도메인 목록에서 `actions`, `servidor` 는 2026-07-21 zone 삭제로 실사용 종료 (위젯 자체는 나머지 6개 도메인용으로 유지, 목록 정리는 별건)
### 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 만 가능_ |
| ironclad.it.com | on | CF Worker (ironclad-site). ~~bouncer~~ 폐기 2026-04-26 |
| keepanker.cv | on (Tunnel) | CF Tunnel + juiceshop 만 iron-kr-waf override. ~~bouncer~~ 폐기 2026-04-26 |
> [!warning] cs-cf-worker-bouncer + BunnyCDN 미들웨어 64811 폐기 (2026-04-26)
> kappa zone (keepanker / ironclad) + 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` 라우팅 워커 (2026-07-21 zone 삭제로 라우트 소실, 스크립트만 잔존)
- [[crowdsec-safeline]] — CrowdSec CF Worker Bouncer 연동
- [[bunnycdn-security]] — BunnyCDN 엣지 보안
- [[nas-storage]] — Synology NAS + `nas.inouter.com` reverse proxy