Files
obsidian/services/netbis.md
kaffa 862ca9bae8 sandbox-tokyo: Debian → NixOS 25.05 전환 (Linode zlambda)
- 새 노트 infra/sandbox-tokyo-nixos.md 작성 (설치 과정, configuration, 후속 작업)
- infra-hosts: 호스트 항목 NixOS 베이스로 갱신, Tailscale IP 100.79.87.48 → 100.78.51.18, vault-prod/wg-easy 항목 제거
- netbis: NixOS 전환으로 APISIX/etcd 컨테이너 모두 제거된 상태 표기, DR 미가동
- searxng: tlsproxy/microsocks 중단, 새 IP 반영
- vault: SSH CA에서 sandbox-tokyo 재등록 필요 표기
- postgresql-ha: /apisix/tokyo prefix 미사용 표기
2026-04-08 14:27:03 +09:00

248 lines
9.9 KiB
Markdown

---
title: Netbis 예비서버 (sandbox-tokyo)
updated: 2026-04-08 NixOS 전환으로 APISIX 미가동
tags: [netbis, apisix, dr, cloudflare, nixos]
---
## 개요
Netbis 팀 도메인의 예비(DR) 리버스 프록시 서버. 평소에는 트래픽을 받지 않으며, 유사시 Cloudflare DNS를 수동 전환하여 활성화.
기존 Ironclad 인프라([[apisix]], [[crowdsec-safeline]])와는 별도 구성.
> **2026-04-08 상태**: 호스트 OS를 Debian 12 → **NixOS 25.05**로 교체하면서 APISIX/etcd 컨테이너가 모두 제거됨. 현재 베이스 시스템(sshd + tailscaled + docker)만 떠 있고 **DR 역할은 미가동**. 재가동하려면 docker compose로 APISIX/etcd 재배포 필요. NixOS configuration: Mac `~/nixos-zlambda/` flake.
## 서버 정보
| 항목 | 값 |
|------|-----|
| 호스트명 | sandbox-tokyo |
| Linode 라벨 | zlambda (id 47271589) |
| 공인 IP | 139.162.71.52 |
| Tailscale IP | 100.78.51.18 (2026-04-08 변경, 이전 100.79.87.48) |
| 위치 | Linode Tokyo (ap-northeast, lish-tokyo2) |
| OS | NixOS 25.05 (Warbler), x86_64-linux |
| Linode kernel | `linode/direct-disk` (NixOS 자체 GRUB) |
| 디스크 | sda 49.5G ext4 (/), sdb 510M swap |
| SSH | `ssh root@sandbox-tokyo` 또는 `ssh root@139.162.71.52` |
| LISH 사용자 | netbis@lish-tokyo2.linode.com (kaffa-Macmini SSH key) |
## APISIX 구성
Docker Compose (/opt/apisix/)로 배포.
| 컨테이너 | 이미지 | 포트 |
|----------|--------|------|
| apisix | apache/apisix:3.15.0-debian | 80(→9080), 443(→9443), 9180 |
| apisix-etcd | gcr.io/etcd-development/etcd:v3.5.11 | 2379 (내부) |
- Admin API: `http://127.0.0.1:9180` (0.0.0.0/0 허용)
- Admin Key: `edd1c9f034335f136f87ad84b625c8f1`
- APISIX 컨테이너 ulimits: nofile 655360
### global_rules
- `real-ip` — source: `http_cf_connecting_ip`, trusted: Cloudflare IP 대역
- `http-logger` → CrowdSec `http://10.253.100.240:8085/apisix-logs` (auth: `apisix-crowdsec-log-2024`)
### 커널 튜닝
`/etc/sysctl.d/99-apisix-tuning.conf` 적용 완료:
- TCP BBR, conntrack 262144, fin_timeout 10s, keepalive 300s
- syncookies, netdev_backlog 16384, port range 1024-65535
- fs.file-max 1048576
## Cloudflare 계정 (Netbis)
| 항목 | 값 |
|------|-----|
| 이메일 | netbis@netbis.io |
| Account ID | 8fcf3c7876332aba33e974cbbfdad951 |
| Global API Key | sandbox-tokyo `/root/.config/cloudflare/cf-global-api-key` |
| Linode API Key | `e7cd3103ca76b865df2533b32eee5c8d7799c963fb29848274245dee142d21b0` |
| API Token (바운서용) | `crowdsec-cf-bouncer-netbis` (Workers, Turnstile, WAF, Zone 권한) |
| Workers 플랜 | Paid ($5/월, 1000만 요청 포함) |
### Zone 목록
| Zone | Zone ID | 플랜 | 현재 오리진 |
|------|---------|------|------------|
| fall-vip.com | 662312b0ca619d1d5c8f4c112150d749 | Pro | 42.125.196.86 |
| fall-mvp.com | 6c171579912a271c0fc89c8187493b0f | Free | 139.162.73.240 |
| fall-vip7.com | a8832b9d3b546f96505abeadea4750d1 | Free | 139.162.73.240 |
| psd777.com | a14533c2937b19e5b7ed19cbecd58679 | Pro | 139.162.114.197 |
| rss-555.com | 6d4b084940520c1f820927e5d8ade2c6 | Pro | 139.162.73.17 |
| rss-7790.com | d9db9e50e202339326498baa340a9d16 | Pro | 139.162.73.17 |
모든 zone은 Cloudflare Flexible SSL, 프록시(오렌지 구름) 사용.
## 라우트 및 업스트림
| 라우트 ID | 호스트 | 업스트림 (오리진 IP) |
|-----------|--------|---------------------|
| fall-vip-com | fall-vip.com | 42.125.196.86 |
| fall-mvp-com | fall-mvp.com | 139.162.73.240 |
| fall-vip7-com | fall-vip7.com | 139.162.73.240 |
| psd777-com | psd777.com | 139.162.114.197 |
| rss-555-com | rss-555.com | 139.162.73.17 |
| rss-7790-com | rss-7790.com | 139.162.73.17 |
| ev-fall-vip-com | ev.fall-vip.com | 42.125.196.115 |
| ev-fall-vip7-com | ev.fall-vip7.com | 42.125.196.115 |
| ev-psd777-com | ev.psd777.com | 42.125.196.115 |
| vi-rss-555-com | vi.rss-555.com | 42.125.196.115 |
| vi-rss-7790-com | vi.rss-7790.com | 42.125.196.115 |
모든 라우트에 `proxy-rewrite` (Host 전달) 적용.
## SSL 인증서
acme.sh + Cloudflare DNS-01 챌린지로 발급. 크론 자동 갱신.
| 도메인 | SAN | 발급기관 | 만료 |
|--------|-----|---------|------|
| fall-vip.com | *.fall-vip.com | ZeroSSL | 2026-07-02 |
| fall-mvp.com | *.fall-mvp.com | ZeroSSL | 2026-07-02 |
| fall-vip7.com | *.fall-vip7.com | ZeroSSL | 2026-07-02 |
| psd777.com | *.psd777.com | ZeroSSL | 2026-07-02 |
| rss-555.com | *.rss-555.com | ZeroSSL | 2026-07-02 |
| rss-7790.com | *.rss-7790.com | ZeroSSL | 2026-07-02 |
인증서 경로: `/root/.acme.sh/{domain}_ecc/`
## CrowdSec 연동
### http-logger
APISIX global_rule로 모든 요청 로그를 CrowdSec(jp1)로 전송.
- 엔드포인트: `http://10.253.100.240:8085/apisix-logs`
- 인증: `auth_header: apisix-crowdsec-log-2024`
- 파서: `custom/apisix-json-logs` (기존 파서 공유)
### Cloudflare Worker Bouncer (netbis-cf)
| 항목 | 값 |
|------|-----|
| 컨테이너 | jp1 incus `netbis-cf-bouncer` (10.253.103.33) |
| 바운서 이름 | netbis-cf (CrowdSec LAPI 등록) |
| LAPI 키 | `FR/PbHA110b6+m/gkByp9itNOaQMdbM8BwKR3DerCTI` |
| 설정 파일 | `/etc/crowdsec/bouncers/crowdsec-cloudflare-worker-bouncer.yaml` |
| 동작 | CrowdSec ban → Cloudflare Worker + Turnstile captcha |
| 적용 범위 | Netbis 계정 전체 6개 zone |
기존 `cs-cf-worker-bouncer` (Kappa 계정용)와 별도 컨테이너로 분리 운영.
## Cloudflare 보안 설정
### Rate Limiting (2026-04-05 변경: 600→120/분)
| Zone | 제한 | 액션 | 차단시간 |
|------|------|------|---------|
| fall-vip.com | 120/분 | managed_challenge | 60초 |
| psd777.com | 120/분 | managed_challenge | 60초 |
| rss-555.com | 120/분 | managed_challenge | 60초 |
| rss-7790.com | 120/분 | managed_challenge | 60초 |
| fall-mvp.com | 20/10초 (~120/분) | block (Free 제한) | 10초 |
| fall-vip7.com | 20/10초 (~120/분) | block (Free 제한) | 10초 |
정상 사용자 IP당 ~10 req/분 기준, 12배 여유. 공격 IP(230+/분)는 확실히 차단.
### Super Bot Fight Mode (2026-04-03 설정)
Pro zone 4개(fall-vip.com, psd777.com, rss-555.com, rss-7790.com)에 적용:
- Definitely automated → **managed_challenge**
- Verified bots → allow
- Static resource protection → true
Free zone(fall-mvp.com, fall-vip7.com)은 미적용.
### DDoS Protection
기본 활성화 상태 (Cloudflare managed ruleset). 감도는 기본값(Medium).
## 공격 이력
### 2026-03-31 ~ 04-01 대규모 봇 공격
| 도메인 | 3/31 요청 | 4/1 요청 | 출처 |
|--------|----------|---------|------|
| rss-555.com | 3050만 (threats 1700만) | 3000만 (threats 2300만) | JP 99% |
| fall-vip.com | 2560만 (threats 1160만) | 1540만 (threats 1000만) | JP 99% |
| fall-mvp.com | 정상 | 738만 (threats 340만) | JP |
- 일본 IP에서 집중된 L7 DDoS 공격
- Cloudflare가 threat으로 분류했으나 완전 차단하지 않음
- 정상 트래픽 일 130~180만 대비 30배 이상 폭주
- 대응: Rate Limiting + SBFM 사후 설정
### 정상 트래픽 기준 (30일 평균)
일 평균 약 140만 요청. 월 환산 약 4200만.
## 로그 분석
### 사용 가능
- **CF GraphQL Analytics API** — 시간별/국가별/threat 데이터 조회 (보관 30일)
- **APISIX http-logger → CrowdSec** — 오리진 도달 요청 분석
### Logpush (Enterprise 전용, 현재 불가)
Cloudflare Logpush(HTTP 요청 로그를 R2 등으로 전송)는 Enterprise 플랜 전용. Pro 플랜에서는 사용 불가.
### Workers Logpush (준비만 완료)
Workers Paid에 포함. CrowdSec Worker Bouncer 요청 로그를 R2에 저장 가능.
- R2 버킷 `cf-logs` 생성 완료 (APAC region)
- R2 API Token: `r2-logpush-cf-logs` (id: 6450de0b6fc95f6d47affa8be3804a75)
- 비용: 월 2000만 건 포함, 초과분 $0.60/100만 건
- 정상 트래픽 기준 약 $13/월 추가 발생 예상
- 공격 시 비용 폭증 가능 → 필요 시에만 활성화 권장, 현재 미활성
### Workers 비용 예상
| 시나리오 | 월 요청 | Workers 비용 |
|---------|--------|-------------|
| 정상 | ~4200만 | ~$14.6 |
| 폭주 포함 | ~1.6억 | ~$50 |
| Rate Limit 적용 후 정상 | ~4200만 | ~$14.6 |
| Rate Limit 적용 후 폭주 | 대폭 감소 예상 | ~$15-20 |
## NPM 서버 (오리진)
| 호스트명 | IP | 비고 |
|---------|-----|------|
| NPM-1 | 172.104.100.11 | |
| NPM-2 | 139.162.114.197 | SSH 비밀번호 인증 → 키 등록 완료 |
| NPM-3 | 139.162.73.17 | rss-555.com, rss-7790.com 오리진 |
| NPM-4 | 139.162.73.240 | fall-vip.com, fall-mvp.com, fall-vip7.com 오리진 |
| NPM-5 | 172.104.70.137 | |
| npm-6 | 172.105.226.218 | |
6대 모두 커널 튜닝 완료 (`/etc/sysctl.d/99-proxy-tuning.conf`):
- TCP BBR, conntrack 262144, fin_timeout 10s, keepalive 300s, port range 1024-65535
- limits.conf nofile 655360 (Docker 컨테이너 반영은 compose ulimits 추가 필요, 서비스 중이라 미적용)
### NPM-4 추가 튜닝 (2026-04-05)
- 커널: tcp_tw_reuse=1, rmem_max/wmem_max 16MB, tcp_max_tw_buckets 131072, tcp_max_orphans 32768
- Nginx: worker_connections 10240, proxy_buffers 16 32k, keepalive_requests 1000, open_file_cache
- real_ip_header: X-Real-IP → CF-Connecting-IP (컨테이너 내 sed, 재시작 시 초기화 주의)
## 유사시 전환 절차
1. Cloudflare DNS에서 각 도메인 A 레코드를 `139.162.71.52`로 변경 (수동)
2. APISIX 라우트/SSL 사전 등록 완료 상태이므로 즉시 서비스 가능
3. 전환 후 CrowdSec 로그 수신 및 바운서 차단 자동 동작 확인
## 이전에 운영했던 서비스 (제거됨)
sandbox-tokyo에서 기존 운영하던 아래 서비스는 2026-04-03 중지, 2026-04-08 NixOS 전환으로 완전 제거:
- APISIX 3.15.0 + apisix-etcd (Docker Compose)
- vault-prod (HashiCorp Vault)
- wg-easy (WireGuard VPN)
- nginx-tcp-proxy
- socks5-v4 (microsocks) — [[searxng]]가 사용 중이었음
- tlsproxy
- Caddy (systemd, disabled)
재구성 시 참고: NixOS 위에 Docker는 이미 설치돼 있으므로 docker compose 디렉토리만 다시 만들면 됨.