ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何配置 gstack iOS QA 的 --tailnet 远程模式:allowlist、能力令牌签发与 Tailscale ACL 加固

如何配置 gstack iOS QA 的 --tailnet 远程模式:allowlist、能力令牌签发与 Tailscale ACL 加固 如何配置 gstack iOS QA 的 --tailnet 远程模式allowlist、能力令牌签发与 Tailscale ACL 加固【免费下载链接】gstackUse Garry Tans exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA项目地址: https://gitcode.com/GitHub_Trending/gs/gstackgstack 的 iOS QA 功能默认只允许本机通过 USB 驱动 iPhone。如果你的 agentClaude Code、任意支持 HTTP 的 agent 或 CI runner跑在另一台机器上就需要把 Mac 端的gstack-ios-qa-daemon切到--tailnet远程模式agent 通过 Tailscale 访问 daemondaemon 用 Tailscale 身份校验WhoIs加本地 allowlist 文件决定谁能连接、能执行到哪一级操作再签发短时效的会话令牌。本文覆盖从安装 Tailscale、启动--tailnet、配置 allowlist、用gstack-ios-qa-mint签发能力令牌到用 Tailscale ACL 做第二层加固的完整路径。前提你已经在本地 USB 模式下跑通过 iOS QA 流程Mac 装 Xcode 16.0、真机 iPhone 已配对并开启 Developer Mode、gstack 完成./setup且gstack-ios-qa-daemon在 PATH 上。远程模式额外要求 Mac 上安装了 Tailscale 并且/var/run/tailscale.sock可被 daemon 读取。确认 Tailscale 环境daemon 的 fail-closed 检查--tailnet模式下 daemon 会先探测/var/run/tailscale.sock。socket 不存在或不可读时daemon拒绝打开 tailnet 监听器fail-closed但 loopback 监听器照常运行——远程模式不会半启动。在配置任何 allowlist 之前先用下面两条命令确认环境来自 ios-qa/docs/tailscale-acl-example.md# 安装并启动 Tailscale登录 tailscaled 后执行验证 brew install --cask tailscale tailscale status # 确认 daemon 能读到 LocalAPI socket test -S /var/run/tailscale.sock echo socket present || echo MISSING输出MISSING时先修复 Tailscale确认以运行 daemon 的同一用户执行tailscale status否则 daemon 启动后 stderr 会出现tailnet binding refused一类的拒绝日志只能退回本地模式。启动 --tailnet 模式在 Mac 上执行gstack-ios-qa-daemon --tailnet行为要点见 docs/howto-ios-testing-with-gstack.mddaemon 会绑定两个监听器loopback完整接口面永不转发到远程和 tailnet锁定的 allowlist 能力层级。tailnet 绑定只针对 Tailscale 接口不会绑0.0.0.0。iOS 应用内的StateServer始终是 loopback-only::1127.0.0.1端口 9999即使开启远程模式也不会直接暴露在 tailnet 上——身份校验全部发生在 Mac 侧因为 iPhone 自身没有 Tailscale 身份。daemon 输出READY: portn pidpid表示 loopback 监听器已就绪loopback 默认端口 9099可用GSTACK_IOS_DAEMON_PORT覆盖。daemon 对~/.gstack/ios-qa-daemon.pid持有独占 flock重复启动是安全的第二次调用会发现已运行的实例并加入。配置 allowlist谁可以做什么allowlist 文件位于~/.gstack/ios-qa-allowlist.json文件权限 0600是谁可以对哪台设备做哪级操作的唯一事实来源。daemon 在每次/auth/mint请求时重新读取该文件修改后立即生效无需重启 daemon。文件结构下面为 tailscale-acl-example.md 中的文档示例身份和注释请按实际情况替换{ version: 1, entries: [ { identity: youexample.com, capabilities: [restore], expires_at: null, note: Owner — full access }, { identity: ciexample.com, capabilities: [mutate], expires_at: 2026-12-31T00:00:00Z, note: CI runner — can write state but not full restore }, { identity: tag:claude-readonly, capabilities: [observe], expires_at: null, note: Agents that should only read } ] }身份标识identity通过 LocalAPI 的 WhoIs 接口规范化写法固定为三种用户 OAuthuserexample.com不带acct:前缀不做域名重写带 tag 的节点tag:tagname小写节点 keynode:nodekey-hex少见文档建议优先用 tag。能力层级是嵌套关系授予高层级即隐含全部低层级层级可访问的接口observe/screenshot、/elements、GET /state/*、/healthz、/session/heartbeat只读interactobserve POST /tap、/swipe、/typemutateinteract POST /state/keyrestoremutate POST /state/restore原则是选能完成任务的最低层级文档原话pick the smallest tier that does the job。用 gstack-ios-qa-mint 签发能力allowlist 决定身份准入令牌签发有两条路径owner 在 Mac 上手动授权或已准入的 agent 通过 tailnet 自助 mint。Owner 授权在 Mac 上运行grant子命令gstack-ios-qa-mint grant --remote aliceexample.com --capability interact gstack-ios-qa-mint grant --remote tag:ci --capability mutate --ttl 86400 --note nightly参数说明来自 gstack-ios-qa-mint 的帮助文本--remote identity规范化 tailnet 身份如userexample.com或tag:ci--capability tierobserve | interact | mutate | restore缺省为interact--ttl seconds可选过期时间正整数秒省略则生成无过期条目--note text随条目保存的自由备注。配套命令gstack-ios-qa-mint revoke --remote identity撤销某个身份gstack-ios-qa-mint list列出全部条目每行输出identity capcaps [expires...] [note...]空 allowlist 输出(empty allowlist)。grant成功时输出granted identity capabilitytier [expires...]。Agent 自助 mint走 tailnet远程 agent 直接请求 daemon tailnet 监听器的POST /auth/mint。daemon 通过 tailscaled 的 WhoIs 端点规范化调用方身份、比对 allowlist然后返回短期会话令牌。tailscale-acl-example.md 给出的示例curl -X POST http://mac-tailnet-ip:9999/auth/mint \ -H Content-Type: application/json \ \-d {capability: interact} # 文档示例返回{session_token: ..., expires_at: ..., capability: interact}其中mac-tailnet-ip需要替换为你 Mac 在 tailnet 上的 IP。注意这是文档示例值9999 在该文档中作为示例端口出现而 howto 文档中 9999 同时是 iOS 应用内 StateServer 的 loopback 端口、daemon loopback 默认端口为 9099因此实际请求时应以 daemon 启动后 tailnet 监听器实际的地址端口为准。令牌生命周期与限额同样来自 ACL 文档daemon 签发的会话令牌默认 TTL 1 小时上限 24 小时--tailnet-session-ttl可通过POST /session/heartbeat续期按ttl_seconds延长封顶在原上限/auth/mint限流每个身份 10 次 / 60 秒第 11 次返回 429tailnet 请求体硬上限 1MB超出 413screenshot 响应硬上限 10MB超出 500。Tailscale ACL 加固第二层daemon 的 allowlist 是第一道访问控制ACL 文档建议再加一层网络层限制——在 Tailscale 管理控制台的 ACL 里限制哪些身份能访问到 daemon 端口。下面为文档示例ios-qa-mac是你的 Mac 在 tailnet 上的主机名ciexample.com、tag:claude-readonly按实际身份替换// In your tailscale admin console: { acls: [ // Allow CI runner to reach the iOS QA Mac on port 9999 only. { action: accept, src: [ciexample.com], dst: [ios-qa-mac:9999] }, // Tagged Claude agents — observe tier only (enforced by daemon, not ACL). { action: accept, src: [tag:claude-readonly], dst: [ios-qa-mac:9999] }, // Default deny. { action: drop, src: [*], dst: [ios-qa-mac:9999] } ] }注意文档同时强调层级observe/interact/…仍由 daemon 执行ACL 只决定能否到达端口。验证审计日志与常见故障审计轨迹每个经过 tailnet 监听器的已认证 mutating 请求写一行到~/.gstack/security/ios-qa-audit.jsonl被拒绝的请求无令牌、令牌过期、能力不足、身份不在 allowlist、触发限流写~/.gstack/security/attempts.jsonl。audit 行格式文档示例字段值仅作示意{ts:2026-05-18T14:23:00Z,identity:ciexample.com,device_udid:00008101-XXXX,endpoint:/tap,session_id:abc...,capability:interact,request_id:req_001,status:200}故障对照合并自 SKILL.md 与 tailscale-acl-example.md 的 failure modes 表现象原因处理daemon 拒绝打开 tailnet 监听器/var/run/tailscale.sock缺失或权限不足安装 Tailscale以运行 daemon 的用户确认tailscale status可用/auth/mint返回403 identity_not_allowed身份不在 allowlist在 Mac 上执行gstack-ios-qa-mint grant --remote identity --capability interact/auth/mint返回403 capability_insufficient令牌层级低于接口要求owner 用更高--capability层级重新 mint/auth/mint返回429 rate_limited同一身份 10 次 mint/分钟等待 60s并检查 agent 为何频繁重新 mint可查 attempts.jsonl/state/restore返回409 schema_mismatch快照来自旧版本 app build丢弃该快照用当前 build 重新捕获边界与限制远程 agent 拿到的永远只是经 Mac 中转的能力iOS 侧 StateServer 永不直接暴露 tailnetiPhone 锁屏、CoreDevice 隧道断开等本地问题仍按本地模式处理503 device_disconnected时 daemon 会重建隧道重试一次持续失败需重连/解锁 iPhone。allowlist 条目不会自动下发远程调用方永远不自动进入 allowlist必须由 Mac owner 显式 grant。需要移除某个身份时用gstack-ios-qa-mint revoke --remote identity或让条目过期expires_at/--ttl。【免费下载链接】gstackUse Garry Tans exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA项目地址: https://gitcode.com/GitHub_Trending/gs/gstack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表