Tailscale のポリシーファイルを展開し、ファイル内を目視で相互参照しなくても各 ACL ルールを読めるようにします。ポリシーファイルは HuJSON (JSON に // と /* */ のコメント、末尾カンマを加えたもの) で、どちらも扱えるため、ファイルをそのまま貼り付けられます。
各ルールを action、プロトコル、送信元、宛先とともに表示します。グループの送信元は同じファイル内の定義からメンバーへ展開し、hosts の宛先はアドレスへ解決し、宛先は最後のコロンでホストとポートに分割します。これにより tag:prod:22 は「tag:prod のポート 22」として読めます。
各ルールには、そのルールを制限する posture 条件も表示します。自身が srcPosture を指定していればその値、指定していなければトップレベルの defaultSrcPosture です。したがって posture を指定していないルールも、default が設定されたポリシーでは無条件ではありません。posture 条件はそれを指定したルールに付く条件で、通信そのものの条件ではありません。ACL ルールは加算的なので、同じ通信を許可する posture なしの別のルールがあれば、その通信は posture なしで許可されます。明示した srcPosture: [] は未指定とは異なり、そのルールを default から外すため、posture 条件なしとして表示します。空でない srcPosture は default に追加されるのではなく、default を丸ごと置き換えます。srcPosture: null は未指定と空配列のどちらを意味するか Tailscale が定義していないため、エラーとして扱います。条件を定義する postures ブロック自体はここでは評価しません。
posture 条件が評価されるのは、同じ tailnet のネイティブな Tailscale ノードからの通信だけです。共有ノードや subnet router の背後にあるデバイスからの通信は posture で判定されず、IP ベースの条件(src、dst、プロトコルとポート)に一致すれば許可されます。送信元がそうした経路かどうかはファイルではなく tailnet 側の状態で決まるため、このツールでは判定しません。
展開できないものは推測しません。tag:、autogroup:、svc: のメンバーシップはポリシーファイルではなく coordination server 側にあるため、種別を表示してそのまま残します。svc: は Tailscale Service で、宛先専用のセレクタです。このツールは種別の分類のみを行い、送信元に使われている場合は有効でないものとして報告します。サービスの存在、advertisement、approval の状態は確認しません。ipset: の参照は、ipset が宣言される場所である同じファイルの ipsets ブロックと照合します。アドレスの展開は行いません。
ファイル内に定義がないもの (打ち間違えたグループ名、hosts に無いホスト名、ipsets に無い ipset 名など) は未解決参照として報告します。そこでの打ち間違いは、ルールの適用対象を静かに変えてしまうためです。あわせて、ルールで使われているのに tagOwners に無いタグ、どのルールからも参照されていないグループ、メンバーが 0 件のグループも報告します。
境界は 2 つあります。acls ではなく grants を使うポリシーはその旨を表示します。そちらは Tailscale Grants マトリクスの担当です。また、tailnet や API へは接続しないため、表示内容はファイルの内容だけを反映し、実際のデバイス状態は反映しません。ポリシーファイルはこのページから出ません。アップロード、保存、ログ出力、URL への埋め込みは行いません。