<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>DevOps on Ops FreeEdge</title>
    <link>https://ops.freeedge.uk/categories/devops/</link>
    <description>Recent content in DevOps on Ops FreeEdge</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 04 Apr 2026 04:00:00 +0000</lastBuildDate>
    <atom:link href="https://ops.freeedge.uk/categories/devops/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tailscale GitHub Actions：CI/CD 流水线集成与 GitOps 工作流深度解析</title>
      <link>https://ops.freeedge.uk/posts/tailscale-github-actions-cicd/</link>
      <pubDate>Sat, 04 Apr 2026 04:00:00 +0000</pubDate>
      <guid>https://ops.freeedge.uk/posts/tailscale-github-actions-cicd/</guid>
      <description>Tailscale 结合 GitHub Actions 实现 CI/CD 流水线自动化：通过 OIDC 获取 short-lived 证书、访问私有资源、部署 K3s 与零信任网络，提供企业级安全持续交付实践指南。</description>
    </item>
    <item>
      <title>Tailscale REST API：程序化 Tailnet 管理与基础设施自动化深度解析</title>
      <link>https://ops.freeedge.uk/posts/tailscale-rest-api-automation/</link>
      <pubDate>Sat, 04 Apr 2026 04:00:00 +0000</pubDate>
      <guid>https://ops.freeedge.uk/posts/tailscale-rest-api-automation/</guid>
      <description>Tailscale REST API 实现 tailnet 的程序化管理：设备、ACL、DNS、Keys 的 CRUD 操作，结合 Terraform 与 GitOps 零接触部署，构建企业级网络自动化。</description>
    </item>
    <item>
      <title>Tailscale 可观测性：Prometheus 指标导出与 Grafana 监控面板深度解析</title>
      <link>https://ops.freeedge.uk/posts/tailscale-observability/</link>
      <pubDate>Sat, 04 Apr 2026 03:30:00 +0000</pubDate>
      <guid>https://ops.freeedge.uk/posts/tailscale-observability/</guid>
      <description>&lt;h1 id=&#34;tailscale-可观测性prometheus-指标导出与-grafana-监控面板深度解析&#34;&gt;Tailscale 可观测性：Prometheus 指标导出与 Grafana 监控面板深度解析&lt;/h1&gt;
&lt;h2 id=&#34;引言&#34;&gt;引言&lt;/h2&gt;
&lt;p&gt;Tailscale 作为一款基于 WireGuard 的零配置 VPN 解决方案，以其简便性和安全性深受 DevOps 工程师青睐。然而，在生产环境中部署 Tailscale tailnet（Tailscale 网络）时，可观测性是确保系统稳定性和性能的关键。本文将深入探讨 Tailscale 的 Prometheus 指标导出机制，包括客户端指标端点（端口 8080，默认 webclient）、Prometheus 抓取配置、核心指标解析（如设备连接、DERP 延迟相关、ACL 命中）、Grafana 仪表板搭建、告警规则设计，以及 tailnet 健康监控的实际案例。通过这些技术实践，您可以构建一个全面的可观测性栈，实现对 Tailscale 网络的实时监控和故障诊断。&lt;/p&gt;
&lt;p&gt;Tailscale 从 v1.78.0 开始支持客户端指标导出，这些指标覆盖子网路由、DERP 中继、吞吐量、丢包等维度。尽管任务提及端口 9090（可能指 tailscaled 调试端点），本文基于官方文档重点使用标准 webclient 端点（100.100.100.100:80/metrics 或 Tailscale IP:8080/metrics）。&lt;/p&gt;
&lt;h2 id=&#34;tailscale-指标端点详解&#34;&gt;Tailscale 指标端点详解&lt;/h2&gt;
&lt;p&gt;Tailscale 客户端暴露 Prometheus 兼容的 &lt;code&gt;/metrics&lt;/code&gt; 端点，支持本地访问和 tailnet 内远程抓取。&lt;/p&gt;
&lt;h3 id=&#34;启用指标导出&#34;&gt;启用指标导出&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地访问&lt;/strong&gt;：无需额外配置，直接访问 &lt;code&gt;http://100.100.100.100/metrics&lt;/code&gt;（quad-100 地址，端口 80）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tailnet 远程访问&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;执行 &lt;code&gt;tailscale set --webclient&lt;/code&gt; 启用 web 界面（默认监听 Tailscale IP:8080）。&lt;/li&gt;
&lt;li&gt;在 tailnet 策略文件中添加 ACL：



&lt;div class=&#34;goat svg-container &#34;&gt;
  
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      font-family=&#34;Menlo,Lucida Console,monospace&#34;
      
        viewBox=&#34;0 0 504 57&#34;
      &gt;
      &lt;g transform=&#39;translate(8,16)&#39;&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;]&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;8&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;{&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;40&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;:&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;[&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;:&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;104&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;p&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;,&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;:&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;240&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;[&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;256&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;监&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;264&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;控&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;272&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;服&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;280&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;务&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;288&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;器&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;304&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;I&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;312&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;P&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;320&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;328&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;]&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;336&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;,&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;352&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;360&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;368&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;376&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;384&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;392&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;:&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;408&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;[&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;416&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;424&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;*&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;432&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;:&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;440&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;8&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;448&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;0&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;456&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;8&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;464&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;0&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;472&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#34;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;480&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;]&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;488&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;}&lt;/text&gt;
&lt;/g&gt;

    &lt;/svg&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;监控服务器可通过 &lt;code&gt;http://&amp;lt;tailscale-ip&amp;gt;:8080/metrics&lt;/code&gt; 抓取。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意：部分文档提及端口 5252，可能为特定场景；标准为 8080。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tailscale Terraform Provider：基础设施即代码与 Tailnet 策略管理深度解析</title>
      <link>https://ops.freeedge.uk/posts/tailscale-terraform-provider/</link>
      <pubDate>Sat, 04 Apr 2026 03:00:00 +0000</pubDate>
      <guid>https://ops.freeedge.uk/posts/tailscale-terraform-provider/</guid>
      <description>&lt;h1 id=&#34;tailscale-terraform-provider基础设施即代码与-tailnet-策略管理深度解析&#34;&gt;Tailscale Terraform Provider：基础设施即代码与 Tailnet 策略管理深度解析&lt;/h1&gt;
&lt;h2 id=&#34;引言&#34;&gt;引言&lt;/h2&gt;
&lt;p&gt;在现代 DevOps 实践中，基础设施即代码（Infrastructure as Code, IaC）已成为标准范式。Tailscale 作为一款零配置 VPN 解决方案，其 Tailnet（Tailscale 网络）策略管理同样可以借助 Terraform Provider 实现自动化。通过 Tailscale 官方维护的 Terraform Provider（&lt;code&gt;tailscale/tailscale&lt;/code&gt;），用户能够以声明式方式管理 ACL（访问控制列表）、DNS 配置、设备标签、认证密钥（Auth Keys）和子网路由等核心资源，实现 GitOps 工作流的全自动化。&lt;/p&gt;
&lt;p&gt;本文将深入剖析该 Provider 的架构、核心资源、使用示例、GitOps 集成、状态管理和从手动配置向 IaC 迁移的策略。无论是初学者还是资深运维工程师，都能从中获益。&lt;/p&gt;
&lt;h2 id=&#34;tailscale-terraform-provider-概述&#34;&gt;Tailscale Terraform Provider 概述&lt;/h2&gt;
&lt;p&gt;Tailscale Terraform Provider 是 Tailscale 团队基于 Terraform Plugin SDK 开发的官方插件，托管于 &lt;a href=&#34;https://registry.terraform.io/providers/tailscale/tailscale/latest&#34;&gt;Terraform Registry&lt;/a&gt;。其源代码位于 &lt;a href=&#34;https://github.com/tailscale/terraform-provider-tailscale&#34;&gt;GitHub&lt;/a&gt;，支持 Tailscale API v2 的所有相关端点。&lt;/p&gt;
&lt;h3 id=&#34;支持的核心资源&#34;&gt;支持的核心资源&lt;/h3&gt;
&lt;p&gt;Provider 支持以下关键资源，用于 Tailnet 策略管理：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;资源名称&lt;/th&gt;
          &lt;th&gt;描述&lt;/th&gt;
          &lt;th&gt;主要功能&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_acl&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Tailnet 策略文件（ACL）&lt;/td&gt;
          &lt;td&gt;定义 grants、hosts、ACL 等策略规则&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_tailnet_key&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;认证密钥（Auth Key）&lt;/td&gt;
          &lt;td&gt;生成可重用、临时、预授权、带标签密钥&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_dns_nameservers&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;全局 DNS 名称服务器&lt;/td&gt;
          &lt;td&gt;配置 nameservers 和 fallback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_dns_search_paths&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;分割 DNS 搜索路径&lt;/td&gt;
          &lt;td&gt;限制域名到特定 nameservers&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_dns_preferences&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;MagicDNS 偏好设置&lt;/td&gt;
          &lt;td&gt;启用/禁用 MagicDNS、overrides 等&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_device_tags&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设备标签&lt;/td&gt;
          &lt;td&gt;为设备应用 ACL 标签&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_device_subnet_routes&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设备子网路由&lt;/td&gt;
          &lt;td&gt;广告子网路由&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;tailscale_device_authorization&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设备授权&lt;/td&gt;
          &lt;td&gt;批准设备加入 Tailnet&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这些资源覆盖了 Tailnet 策略的 90% 以上场景，支持 Hujson/JSON 格式策略定义。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
