Skip to main content

A visual way to view your ACL and Grant rules for Tailscale

Project description

Tailscale Network Topology Mapper

A visual way to view your ACL and Grant rules for Tailscale

I occasionally find myself just wanting to get a glance of how my ACL rules look without reading through the code. This is also useful for showing how our policies are set up to people who are not devs by trade.

Demo showing the search and filter functionality on the network topology map to narrow down nodes


What Is This?

The Tailscale Network Topology Mapper is a tool for visualizing your network access rules. It turns your Tailscale ACL and Grant configurations into a self-contained, interactive HTML map—making it easier to understand and share your network layout.

Key Features

Network Visualization

  • Interactive Graph: Generates a network_topology.html file you can open or host anywhere.
  • Color-Coded Nodes:
    • 🟡 Groups
    • 🟢 Tags
    • 🔴 Hosts
  • Shape-Coded Rule Types:
    • Circles (●) - ACL-only
    • Triangles (▲) - Grant-only
    • Hexagons (⬢) - Nodes in both ACL and Grant rules

Advanced Search & Filtering

  • Keyword Search: Find nodes by name, port, protocol, routing, posture checks, or group membership.
  • Highlighting: Matching nodes are visually marked and highlighted.

Detailed Tooltips

Hover over nodes to see:

  • Rule references (with line numbers)
  • Protocols (e.g., tcp:443, udp:53)
  • Via-routing information
  • Posture check requirements
  • App-level access controls
  • Group memberships

Access Relationships

  • Directional Edges: Arrows show who can talk to whom.
  • Legacy + Modern Rule Support: Handles ACLs and Grant rules simultaneously.
  • Protocol Display: Shows IP protocol details for destination nodes.

Interactive UI

  • Movable search box (drag-and-drop)
  • Smooth zoom controls (configurable)
  • Connected node highlighting when selected

Supported Tailscale Features

  • Policy Formats: JSON and HuJSON (Human JSON)
  • Modern Grant Support:
    • IP protocols (tcp, udp, icmp, etc.)
    • Via-routing
    • Posture checks
    • Application-level access controls
  • Legacy ACL Compatibility: Full support for traditional ACL rules

🛠️ Setup Instructions

Requirements

  • Python 3.10+
  • Git
  • uv (recommended) or pip

Installation Methods

Option 1: Using uvx (Recommended - No Installation Required!)

The fastest way to run the mapper without any installation:

# Add your policy.hujson file to current directory (see configuration section below)
# Then run directly with uvx
uvx tailscale-network-topology-mapper

This will run the latest version of the mapper against the policy file (policy.hujson). You will now have a network_topology.html file in the current directory that you can open in your browser.

Optionally, you can point the tool to a specific policy file:

uvx tailscale-network-topology-mapper --policy-file /path/to/your/policy.hujson

To use Tailscale's API for validation instead of the built-in offline sanity checks, see the Using Tailscale's API for Validation section below.


Option 2: Using uv (Recommended for Development)

Show uv installation
  1. Install uv if you haven't already:

    # macOS/Linux
    curl -LsSf https://astral.sh/uv/install.sh | sh
    
    # Windows
    powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
    
  2. Clone and set up:

    git clone https://github.com/SimplyMinimal/tailscale-network-topology-mapper
    cd tailscale-network-topology-mapper
    
    # Install dependencies
    uv pip install -r requirements.txt
    

Option 3: Using pip (Traditional Method)

Show Traditional pip installation
  1. Clone the repo:

    git clone https://github.com/SimplyMinimal/tailscale-network-topology-mapper
    cd tailscale-network-topology-mapper
    
  2. Install dependencies:

    pip install -r requirements.txt
    

Configuration

Click to show Optional configuration
  1. Add your policy:

    • Replace the contents of policy.hujson with your actual Tailscale ACL.
  2. Set your company domain:

    • Edit config.py and change:
    COMPANY_DOMAIN = "example.com"
    
    • Or set an environment variable:
    export TS_COMPANY_DOMAIN=yourcompany.com
    
  3. Set your Tailscale API key and tailnet environment variables for Tailscale API validation:

    export TAILSCALE_API_KEY=your-api-key
    export TAILSCALE_TAILNET=your-tailnet
    

Using Tailscale's API for Validation

Click to show setup for Tailscale API Validation

By default, the tool validates your policy using local structure validation without an API key as a best-effort validation. However, you can optionally configure the tool to use Tailscale's API for validation. This provides a more accurate validation but requires setting up environment variables for your Tailscale API key and tailnet. It's recommended to protect the environment variables which is out of the scope of this tool for now.

Setup

  1. Get your Tailscale API Key:

  2. Get your Tailnet Name:

    • This is typically your organization name (e.g., example.com in https://login.tailscale.com/admin/settings/general). You can use either Tailnet ID or Legacy ID.
  3. Set Environment Variables:

    macOS/Linux

    # Set your API key
    export TAILSCALE_API_KEY=tskey-api-xxxxx
    
    # Set your tailnet
    export TAILSCALE_TAILNET=yourcompany.com
    

    Windows

    # Set your API key
    set TAILSCALE_API_KEY=tskey-api-xxxxx
    
    # Set your tailnet
    set TAILSCALE_TAILNET=yourcompany.com
    

Usage

Once the environment variables are set, the tool will automatically use Tailscale's API for validation:

# The tool will now validate via Tailscale's API
uvx tailscale-network-topology-mapper
# or
python3 main.py

If the environment variables are not set, the tool falls back to internal sanity checks for policy validation.


Generate the Map

# Using uvx (no installation needed)
uvx tailscale-network-topology-mapper

# Using uv
uv run python main.py

# Using traditional Python
python3 main.py

# Enable debug logging with any method by adding --debug
python3 main.py --debug

This creates (or updates) network_topology.html. Open it in any browser.


🐳 Running with Docker

Docker instructions If you prefer Docker:

Prerequisites

  • Docker
  • make

Run It

make build run

Then open http://localhost:8080 in your browser.

Use the filter bar or click on any node to narrow down the view.


🔁 Automate with GitHub Actions

Want your map to update automatically when you change your ACL?

Check out this sample workflow:
.github/workflows/tailscale.yml


⚠️ Limitations

  • Still in alpha—expect some rough edges.
  • Only parses what’s in policy.hujson. It doesn’t actively discover devices.
  • Currently focused only on ACL and Grant rules (other policy sections may be supported in future versions).

🧪 Experimental & TODOs

  • Integrate tailscale debug netmap for deeper insights
  • Add view toggles: ports, hosts, users/groups
  • Improve the visual design and layout

📢 Disclaimer

This is an independent project and not affiliated with Tailscale.
It’s designed as a companion tool to better understand and visualize your Tailscale network policies.


🙌 Contributions Welcome!

Pull requests, suggestions, and feedback are appreciated!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tailscale_network_topology_mapper-2.1.4.tar.gz (38.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file tailscale_network_topology_mapper-2.1.4.tar.gz.

File metadata

File hashes

Hashes for tailscale_network_topology_mapper-2.1.4.tar.gz
Algorithm Hash digest
SHA256 e4139eee5ace1ff0993e9311e28b0bf6e82d2326edadba10714f37fc4a0d535d
MD5 e5c371f2638e4575a38795ef624cf8ef
BLAKE2b-256 cf147d94923150b51ac7ceab73db454f46ba702a4d3711eb795f750910458b12

See more details on using hashes here.

Provenance

The following attestation bundles were made for tailscale_network_topology_mapper-2.1.4.tar.gz:

Publisher: publish-pypi.yml on SimplyMinimal/tailscale-network-topology-mapper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tailscale_network_topology_mapper-2.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for tailscale_network_topology_mapper-2.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 acaa19c3cdd2d76449a591ff0eed84bb714b143b8720368d9eb7ee2689d499c8
MD5 ca9780f5267f8728ffab4d01526ef0a3
BLAKE2b-256 e032219a9a4d1c02ca4a61d0218cccafa49808bb38109cffd2523b9ba50a75a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for tailscale_network_topology_mapper-2.1.4-py3-none-any.whl:

Publisher: publish-pypi.yml on SimplyMinimal/tailscale-network-topology-mapper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page