# 新节点重建 + 避风控 Checklist > 背景:首个 RackNerd VPS(107.172.55.251)在下单 3 天后被**支付风控部门**暂停 > (要求 Stripe Identity 实名验证,因没及时回应被自动 suspend)。**不是流量被检测** > ——栽的是「新号 + 信用卡 + 中美地理不一致」的反欺诈画像 + 没处理验证请求。 > 本文档固化:① 开局避风控的注意事项 ② 脚本化重建步骤 ③ 重建后必做(备份/测试)。 相关:合规决策见 todo #10(Apple/VPS 实名暴露)。 --- ## 一、选商 + 开局避风控(下单前/当天) - **选 VPN 宽容的商家**:RackNerd 风控偏严。优先选明确允许 VPN/proxy、或对此宽松的商家。 - **付款画像别太冲**: - 新号 + 信用卡 + 中国 IP 买美国机 = 高危组合,极易触发反欺诈。 - 想匿名 → **加密货币**(伪匿名、不可退);想省事 → 信用卡/支付宝(实名,可能风控)。权衡见 todo #10。 - **下单后立刻看邮件/客户区工单**:若有「Additional Order Verification」之类的验证请求, **当天就处理**(验证 or 当天退款换地方),**别拖**——拖几天会被自动 suspend。 - **养号**:别新机当天就大流量/纯翻墙特征;先低调用两天。 - **主体/身份隔离**:别用核心身份/主体撑 VPN 基础设施(同 todo #10)。 - **多节点**:别把鸡蛋放一个篮子,一台被停不至于全断。 ## 二、脚本化重建(新 VPS 到手后,约 30 分钟) 前提:新机 Debian 12,root SSH(配 `~/.ssh/config` 别名,如 `node2`)。 ### 1. 加固(幂等) ```bash scp -r deploy/bootstrap node2:/root/ && ssh node2 'cd /root/bootstrap && bash init.sh' ``` 装:ufw + fail2ban + BBR + swap + pangolin 用户 + Telegram 监控。 ### 2. 整套自建栈(控制面 + agent + sing-box) ```bash ssh node2 'cd /path/to/repo && sudo VPS_IP=<新机公网IP> bash deploy/single-node/deploy.sh' ``` 起:SQLite(512MB 约束,不用 MySQL)+ Redis + pangolin-server(`:8080` HTTP / `:9443` gRPC mTLS) + pangolin-agent + sing-box(reality-in TCP443 + hy2-in UDP443)。 ### 3. ⚠️ 替换 sing-box 为带 v2ray_api 的自编版(per-user 流量统计必需) single-node 装的是官方 sing-box(**无 v2ray_api**),per-user 统计跑不了。需替换: ```bash # 本机编(sing-box v1.13.13 源码;与官方对齐,绕 badtls linkname 坑) TAGS="$(cat release/DEFAULT_BUILD_TAGS_OTHERS),with_v2ray_api" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \ -ldflags "-s -w -checklinkname=0 -X github.com/sagernet/sing-box/constant.Version=1.13.13" \ -tags "$TAGS" -o sing-box-v2ray ./cmd/sing-box # 传到节点替换 + 重启 agent(agent 会重渲染带 v2ray_api 的配置) scp sing-box-v2ray node2:/tmp/ ssh node2 'systemctl stop pangolin-agent sing-box; install -m755 /tmp/sing-box-v2ray /usr/bin/sing-box; systemctl start pangolin-agent' ``` > agent 用 `UseV2RayUsage()`(cmd/agent/main.go),配置自动带 `experimental.v2ray_api` > + `stats.users`=全 dp_uuid;hy2 自签证书由 agent 自动生成(`/etc/sing-box/hy2.{crt,key}`)。 ### 4. 防火墙放行(ufw) ```bash ssh node2 'ufw allow 22/tcp; ufw allow 8080/tcp; ufw allow 443/tcp; ufw allow 443/udp' ``` - `22` SSH、`8080` 控制面 HTTP(客户端访问)、`443/tcp` REALITY、`443/udp` Hy2。 - `9443` gRPC 仅 agent↔控制面本机,**不对外**。 ### 5. enroll 节点 + 建账号 + 配置 - agent 自 enroll(deploy 流程内);确认 `nodes` 表里新节点 endpoint = `<新IP>:443`、reality_sni 等。 - hy2 如需启用:`sqlite3 /var/lib/pangolin/pangolin.db "UPDATE nodes SET hy2_port=443; UPDATE directory_version SET version=version+1 WHERE id=1;"`。 - 建/迁用户账号(测试用 wang880812@gmail.com 等)。 - **客户端指向新控制面**:`flutter run -d macos --dart-define=PANGOLIN_API_URL=http://<新IP>:8080` (或 `scripts/local_test.sh` 的 `API_URL` 改新 IP)。 ## 三、重建后必做 - [ ] **立刻备份控制面 DB**(避免再被停时丢数据): ```bash scp node2:/var/lib/pangolin/pangolin.db ./backups/pangolin-$(date +%F).db ``` > ⚠️ 注意:**禁止 Bash 用 `$()`**(全局规则),实际执行时拆步或用固定文件名。 - [ ] 定期备份 DB(cron / 手动),关键密钥(`/etc/pangolin*`)另存(不入 git)。 - [ ] 关掉本地 Shadowrocket 等占 TUN 的代理 → 测客户端连真节点(出口 IP = 新节点)。 ## 四、上线测原生隧道(macOS,接 P1) 新节点通后,接着 P1 最后一步实测(代码全就绪): 1. 关 Shadowrocket(避免 TUN 冲突) 2. `flutter run -d macos --dart-define=PANGOLIN_API_URL=http://<新IP>:8080` 3. app 加载节点 → 点连接 → sysext 加载(系统设置允许一次)→ 真隧道 4. Console.app 搜 `PacketTunnel` 看扩展日志(startTunnel / openTun / 报错),逐个调运行时问题 5. 验证出口 IP = 新节点;速率/延迟/Kill Switch/退出拆隧道全过 → `kUseNativeVpnMacOS` 已 true