docs(agent): 记录 auth_user 血泪教训 + 客户端隧道前置 + 验收须真连接
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -59,6 +59,7 @@
|
||||
<li>每个 Task 结束必须 <code>cd server && go build ./... && go test ./internal/agentd/...</code> 全绿再提交。</li>
|
||||
<li>Commit message 前缀用 <code>feat(agent):</code> / <code>test(agent):</code> / <code>refactor(agent):</code>。</li>
|
||||
</ul>
|
||||
<blockquote><p><b>执行后修订(2026-07-23,提交 <code>2abe4d0</code>)· 血泪教训</b>:放行规则匹配凭证必须用 <b><code>auth_user</code></b> 而非本计划各处写的 <code>user</code>。<code>sing-box check</code> 对两者都语法通过,但 <code>user</code> 字段对 VLESS/REALITY 入站<b>运行时不匹配</b>,导致放行规则永不命中、<b>连白名单用户也被兜底拒绝</b>(全员进不去)。生产上线时踩中,本地起真 VLESS 连接实测才定位。<b>凡本计划(Task 2 <code>rules()</code>、Task 3 测试)出现 <code>r["user"] = uuids</code> 或断言 <code>r["user"]</code> 之处,一律应为 <code>auth_user</code>。</b> 且验收不能只跑 <code>sing-box check</code>——必须真连接跑一次(节点端「白名单 uuid 一进一出」即可)。</p></blockquote>
|
||||
<hr>
|
||||
<h3>Task 1: ACL 配置类型、加载与 fail-closed 的 active()</h3>
|
||||
<p><b>Files:</b></p>
|
||||
@@ -1068,14 +1069,19 @@ git commit -m "docs(agent): 私有目的地 ACL 配置样例与常驻校验
|
||||
<ol>
|
||||
<li>写 <code>/etc/pangolin-agent/acl.json</code>(权限 <code>0600</code>,属主 <code>pangolin</code>),<code>systemctl reload pangolin-agent</code>。</li>
|
||||
<li><code>journalctl -u pangolin-agent -n 30</code> 确认已重渲染、无 <code>[acl] ERROR</code> / <code>[acl] ALERT</code>。</li>
|
||||
<li><code>sudo python3 -c "import json;print(json.load(open('/etc/sing-box/config.json'))['route'])"</code> 确认规则顺序为 sniff → 放行 → 拒绝 → warp。</li>
|
||||
<li><code>sudo python3 -c "import json;print(json.load(open('/etc/sing-box/config.json'))['route'])"</code> 确认规则顺序为 sniff → resolve → 放行 → 拒绝 → warp(resolve 见 I3:堵住 ip_cidr 目的地的域名形式绕过)。</li>
|
||||
</ol>
|
||||
<p> <b><code>config.json</code> 内容正常不等于线上生效</b>——SIGHUP 走的是 sing-box 自身校验,若新配置被 sing-box 拒绝,它会保留旧实例继续跑,agent 侧仍记"渲染成功"。reload 后必须额外确认:</p>
|
||||
<ul>
|
||||
<li><code>systemctl is-active sing-box</code> → <code>active</code>;</li>
|
||||
<li><code>journalctl -u sing-box -n5 | grep -v FATAL</code>(有 FATAL 说明 sing-box 拒绝了新配置,旧实例还在跑,config.json 上的内容其实没生效)。</li>
|
||||
<li><b>我的设备</b>:brain 首页 200、DSM 5001 可登录、<code>ssh nas-r</code> 通。</li>
|
||||
<li><b>另一账号的设备</b>:以上全部被拒(连接被 reject,不是超时)。</li>
|
||||
<li><b>另一账号的设备</b>:以上全部被拒(连接被 reject,不是超时)。<b>分别用域名和裸 IP 两种形式各测一遍</b>(如 <code>curl https://brain.51yanmei.com</code> 与 <code>curl --resolve brain.51yanmei.com:443:103.119.13.48 https://brain.51yanmei.com</code>;DSM 同理分别用 <code>nas.51yanmei.com:5001</code> 与 <code>182.92.213.171:5001</code>)——I3 表明目的地表达形式(域名 vs IP)会走到不同的 sing-box 匹配路径,只测一种形式验证不到位。</li>
|
||||
<li><b>公开站不受影响</b>:jiu / travel / sudoku / pay 在两个账号下均正常。</li>
|
||||
<li><b>WARP 未被破坏</b>:reddit 仍走 warp 出口。</li>
|
||||
<li><b>fail-closed 实证</b>:把 <code>acl.json</code> 改坏 → <code>systemctl reload pangolin-agent</code> → 规则仍在、日志有 ERROR;恢复文件。</li>
|
||||
<li><b>不断线实证</b>:reload 期间另一台设备保持连接不掉。</li>
|
||||
</ol>
|
||||
</ul>
|
||||
<h2>不在本计划范围内</h2>
|
||||
<ul>
|
||||
<li>给 brain 加 mTLS / basic auth 作纵深防御(与本计划正交,约一小时,另开)</li>
|
||||
|
||||
Reference in New Issue
Block a user