Headscale 如何用 autoApprovers 自动审批子网路由?
Headscale 如何用 autoApprovers 自动审批子网路由【免费下载链接】headscaleAn open source, self-hosted implementation of the Tailscale control server项目地址: https://gitcode.com/GitHub_Trending/he/headscale在 Headscale一个开源、可自托管的 Tailscale 控制服务器tailnet 中接入子网路由subnet router时存在双重确认机制路由既要在子网路由器节点上宣告也要在控制服务器上批准之后 tailnet 中的其他节点才能使用。新路由器每次上线都手动执行一次批准命令很繁琐Headscale 通过策略文件中的autoApprovers段来解决这个问题让带有指定 tag 的子网路由器一旦宣告路由就由控制服务器自动批准。本文给出从策略文件配置到验证自动审批生效的完整操作路径适用前提是你已有一个运行中的 Headscale 控制服务器并且路由器节点可以安装 Tailscale 客户端。先理解手动审批流程明确自动化要替代的环节按 路由文档 描述的标准流程配置子网路由分三步在节点上宣告路由节点侧确认$ sudo tailscale up --login-server YOUR_HEADSCALE_URL --advertise-routes10.0.0.0/8,192.168.0.0/24节点已注册时用tailscale set --advertise-routes...可以宣告新路由或更新已宣告的路由。在控制服务器上查看并批准路由控制服务器侧确认$ headscale nodes list-routes ID | Hostname | Approved | Available | Serving (Primary) 1 | myrouter | | 10.0.0.0/8 | | | | 192.168.0.0/24 |上表是文档示例输出Approved列为空表示路由已被发现但尚未批准。批准后$ headscale nodes approve-routes --identifier 1 --routes 10.0.0.0/8,192.168.0.0/24 Node updated--identifier对应list-routes输出中的节点 ID--routes是要批准的路由以逗号分隔。autoApprovers自动化替代的正是第 2 步符合策略条件的路由不再等待人工批准。准备配置策略文件路径Headscale 默认不加载任何策略此时节点间允许所有流量。要启用autoApprovers需要在配置文件中通过policy.path键指定策略文件路径见 策略文档。关于配置文件本身见 配置文档Headscale 从 YAML 文件加载配置默认依次在/etc/headscale、$HOME/.headscale、当前工作目录查找config.yaml也可以用-c/--config命令行参数或HEADSCALE_CONFIG环境变量指定其他路径。修改配置后可用headscale configtest校验配置文件。另一个关键点修改策略文件后必须重载 Headscale 才能生效文档给出两种方式见 策略文档$ sudo systemctl reload headscale或者向主进程发送 SIGHUP 信号$ sudo kill -HUP $(pidof headscale)这两条命令会触发 Headscale 重新加载策略属于服务重载操作会短暂中断策略计算但不删除数据。Headscale 在每次重载后会记录策略处理结果到日志可用于确认策略是否被成功加载。编写包含 autoApprovers 的策略策略文件采用与 Tailscale 相同的 huJSON 格式。针对子网路由自动审批需要两类字段配合示例取自 路由文档 中的策略片段tagOwners声明某个 tag 允许被哪个用户拥有。tag 只有在tagOwners中被授权后路由器才能合法使用它。autoApprovers.routes以路由前缀为键、可批准的 tag 列表为值。凡是宣告了列表中任一 tag 的子网路由器其宣告的路由会被自动批准。{ tagOwners: { tag:router: [alice] }, autoApprovers: { routes: { 192.168.0.0/24: [tag:router] } }, grants: [ // 你的其他访问控制规则 ] }各字段在文档中的含义tag:router: [alice]允许用户alice拥有tag:router。alice中的表示按用户名前缀匹配。请替换为你 tailnet 中的实际用户名。192.168.0.0/24: [tag:router]路由192.168.0.0/24在被带有tag:router的子网路由器宣告后自动批准。这里的路由前缀要替换为你实际要接入的网段同一策略可以为多个前缀各写一条映射。grants段是访问控制规则如果策略文件中完全省略acls或grants段Headscale 默认为放行所有流量见 策略文档 的 Allow All 一节。如果已有访问控制需求把autoApprovers和tagOwners合并进现有策略文件即可。让子网路由器同时宣告 tag 和路由autoApprovers的匹配依据是 tag所以路由器节点入网时必须同时宣告 tag 和路由。在路由器节点上执行YOUR_HEADSCALE_URL替换为你的 Headscale 服务器地址$ sudo tailscale up --login-server YOUR_HEADSCALE_URL --advertise-tags tag:router --advertise-routes 192.168.0.0/24这条命令需要sudo权限会启动或重新配置该机器上的 Tailscale 客户端并加入你的 tailnet。tag 的授予方式见 tags 文档可以在注册时通过--advertise-tags参数应用如上也可以配合带 tag 的预认证密钥使用。注意匹配条件只有 tag 与autoApprovers中列出的 tag 一致时才会触发自动审批。路由器没有宣告 tag或宣告了策略中未列出的其他 tag路由仍然停留在待批准状态需要回退到手动审批。验证自动审批是否生效把策略文件写入policy.path指向的位置后重载服务然后在控制服务器上查看路由状态$ headscale nodes list-routes ID | Hostname | Approved | Available | Serving (Primary) 1 | myrouter | 10.0.0.0/8 | 10.0.0.0/8 | 10.0.0.0/8 | | 192.168.0.0/24 | 192.168.0.0/24 | 192.168.0.0/24文档示例中自动审批成功后Approved、Available、Serving (Primary)三列都会填上路由前缀。判断标准Approved列有值且没有人工执行过approve-routes说明autoApprovers规则命中了。如果Approved列仍为空检查两个方向策略文件是否已被policy.path正确加载重载后查看日志中的策略处理结果以及路由器宣告的 tag 是否与autoApprovers中列出的 tag 一致。路由可用后还需完成 路由文档 中提到的收尾工作在消费路由的节点上执行sudo tailscale set --accept-routes接受路由路由器本身要启用 IP 转发才能真正转发流量。限制与边界文档明确给出的边界如下tag 是自动审批的匹配依据autoApprovers通过 tag 关联路由与路由器而不是通过用户或主机名直接匹配。路由器必须先被授权使用tagOwners中声明的 tag。策略变更需要重载autoApprovers修改后不会热生效必须sudo systemctl reload headscale或发送 SIGHUP。策略仍受访问控制约束自动审批只解决路由何时可用谁可以使用该路由仍由策略中的grants/acls决定。路由文档 给出了用策略限制子网路由使用范围的示例片段hostsgrants可以按需并入同一策略文件。高可用场景当至少两个节点宣告同一前缀时Headscale 默认启用高可用路由一台路由器下线时另一台可以继续提供服务对应配置项为node.routes.ha。多个路由器都带上同一个 tag 即可同时纳入自动审批。自动审批 exit node 是另一个字段autoApprovers的exitNode键用于自动审批出口节点如exitNode: [tag:exit]与本文的routes键互不影响可按需单独配置见 路由文档 的 Automatically approve an exit node with auto approvers 一节。autoApprovers更完整的语法说明以 Tailscale 官方的 policy file 文档为准路由文档 文末提供了官方文档的指引本文只覆盖 Headscale 文档中实际展示的子网路由自动审批用法。【免费下载链接】headscaleAn open source, self-hosted implementation of the Tailscale control server项目地址: https://gitcode.com/GitHub_Trending/he/headscale创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考