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-routes=10.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决定。路由文档 给出了用策略限制子网路由使用范围的示例片段(hosts+grants),可以按需并入同一策略文件。 - 高可用场景:当至少两个节点宣告同一前缀时,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),仅供参考