From dbc787ac2e34ffcae91f68b9ba4662b77ee5702b Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Thu, 23 Jul 2026 07:38:16 +0800 Subject: [PATCH] =?UTF-8?q?docs(agent):=20=E8=AE=BE=E8=AE=A1=20=C2=A712=20?= =?UTF-8?q?=E8=A1=A5=20SNI=20=E7=BB=95=E8=BF=87=E6=AE=8B=E7=95=99=20+=20br?= =?UTF-8?q?ain=20basic=20auth=20=E5=B7=B2=E8=90=BD=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- docs/private-dest-acl-design.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/private-dest-acl-design.html b/docs/private-dest-acl-design.html index f5d7bc6..059364c 100644 --- a/docs/private-dest-acl-design.html +++ b/docs/private-dest-acl-design.html @@ -234,7 +234,8 @@ journalctl -u pangolin-agent -n 20 # 确认已重渲染、无 ACL ERROR
  • 泄露 节点配置里我的几台设备 uuid 会出现在同一条规则中(自我关联),且目的地明文可见。目的地本就在公网 DNS 里,泄露面小;但这确实弱化了 render.go:14 的「节点只见不透明 dp_uuid」不变式,属于知情接受,需在该注释处补一行说明。
  • 缺闸 守红线的 assertNoIdentityFieldsagentd/singbox_test.go)只作用于 state.json从不检查渲染出的 sing-box 配置。本设计不扩大这个缺口,但也没有补上——补闸另开。
  • -
  • 建议 本闸失效时(agent 挂了、配置写错)brain 会重新变成对全体 pangolin 用户可读的裸站。建议另外给 brain 加一层 mTLS 或 basic auth 作纵深防御,约一小时工作量,与本设计正交。
  • +
  • 架构限制 443 vhost 的判定依赖 SNI,可被绕过。brain/git,节点侧唯一的区分手段是 sniff 出的 SNI。攻击者(持有效 dp_uuid 的其他 pangolin 用户)向 182.92.213.171:443 发起不带 SNI 的 TLS、握手后用 Host: brain.51yanmei.com 头访问,则不匹配任何 domain 规则、也不匹配 ip_cidr(443 不在端口清单里)→ 落 final:direct → nginx 按 Host 路由放行。这在 sing-box 层无法闭合——不能整封 :443,否则 jiu/travel/sudoku/pay 一起死。因此下面这条 brain 鉴权不是「可选纵深」,而是本闸对 brain 的前置条件
  • +
  • 已做(2026-07-23) brain 已加 nginx basic auth 作纵深防御:ali 的 /etc/nginx/conf.d/brain.conf 在原有 allow 103.119.13.48; deny all 之上叠加 auth_basicsatisfy 默认 all → 源 IP 白名单 口令二者都需满足),口令存 Bitwarden「brain basic auth」,htpasswd 仅存 apr1 哈希(明文不落 ali)。acme 通道(:80)与 robots.txt 免密。这样即便本节点 ACL 闸失效(agent 挂了、配置手抖)或被上面的 SNI 手法绕过,brain——唯一无自带鉴权的私有服务——仍不裸奔。
  • 相关:~/code/brain/docs/remote-access-brain-domain.html(brain 外网入口与出口 IP 白名单)· baize 台账 ~/code/baize/data/{hosts,domains}.yaml